Ответ 1
AsyncQueryHandler является абстрактным классом, поэтому вы не можете его напрямую создать. Вам нужно подклассифицировать его.
Я пытаюсь реализовать AsyncQueryHandler
, потому что я испытываю ту же самую проблему в этой ссылке, но я не вижу никакого примера или что-то о его реализации.
Я пробовал делать
AsyncQueryHandler handler = new AsyncQueryHandler(getContentResolver());
так как это то, что конструктор показывает в docs, но я получаю сообщение об ошибке cannot instantiate the type AsyncQueryHandler
, так как я могу его использовать?
AsyncQueryHandler является абстрактным классом, поэтому вы не можете его напрямую создать. Вам нужно подклассифицировать его.
Это так удобно:
AsyncQueryHandler handler =
new AsyncQueryHandler(mActivity.getContentResolver()) {};
handler.startUpdate(-1, null, sessionUri, values, null, null);
Это очень удобно, когда вам нужно выполнить аудит CRUD без использования Loader, поэтому, расширяя его от asyncquery, вы получаете такой метод, как startQuery, startInsert, startUpdate и startDelete легкая реализация может быть:
public class CustomAsyncHandler extends AsyncQueryHandler {
private WeakReference<AsyncQueryListener> mListener;
public interface AsyncQueryListener {
void onQueryComplete(int token, Object cookie, Cursor cursor);
}
public CustomAsyncHandler(ContentResolver cr, AsyncQueryListener listener) {
super(cr);
mListener = new WeakReference<AsyncQueryListener>(listener);
}
public CustomAsyncHandler(ContentResolver cr) {
super(cr);
}
/**
* Assign the given {@link AsyncQueryListener} to receive query events from
* asynchronous calls. Will replace any existing listener.
*/
public void setQueryListener(AsyncQueryListener listener) {
mListener = new WeakReference<AsyncQueryListener>(listener);
}
/** {@inheritDoc} */
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
final AsyncQueryListener listener = mListener.get();
if (listener != null) {
listener.onQueryComplete(token, cookie, cursor);
} else if (cursor != null) {
cursor.close();
}
}
}
Как вы видите, есть дополнительный интерфейс AsyncQueryListener, созданный как обратный вызов, когда запрос завершен, так как вы можете создать AsyncUpdateListener, AsyncDeleteListener, AsyncInsertListener и т.д.
AsyncQueryHandler asyncQueryHandler = new AsyncQueryHandler(activity.getContentResolver()){
@Override
protected void onInsertComplete(int token, Object cookie, Uri uri) {
super.onInsertComplete(token, cookie, uri);
Log.d(TAG, "onInsertComplete return uri: " + uri);
}
};
asyncQueryHandler.startInsert(-1, null, mUri, values);