实现AsyncQueryHandler

tyc*_*czj 14 android android-handler

我正在尝试实现,AsyncQueryHandler因为我在此链接中遇到了同样的问题,但我没有看到任何关于实现它的示例或任何内容.

我试过了

AsyncQueryHandler handler = new AsyncQueryHandler(getContentResolver());
Run Code Online (Sandbox Code Playgroud)

因为这是构造函数在文档中显示的内容,但我得到一个错误cannot instantiate the type AsyncQueryHandler,说明如何使用它呢?

Cro*_*ong 17

这很方便:

AsyncQueryHandler handler = 
    new AsyncQueryHandler(mActivity.getContentResolver()) {};
handler.startUpdate(-1, null, sessionUri, values, null, null);
Run Code Online (Sandbox Code Playgroud)


Tyl*_*eat 11

AsyncQueryHandler是一个抽象类,因此您无法直接实例化它.你需要将它子类化.


Nec*_*net 11

当你需要在不使用Loader的情况下进行CRUD操作异步时非常方便,所以通过从asyncquery扩展你得到的方法,如startQuery,startInsert,startUpdatestartDelete,一个简单的实现可能是:

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();
            }
        }

    }
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在查询完成时,会创建一个额外的AsyncQueryListener接口作为回调,因为您可以创建AsyncUpdateListener,AsyncDeleteListener,AsyncInsertListener等.

  • 因为加载程序不适用于CRUD操作! (3认同)
  • 额外的侦听器接口是因为您需要将事件传播回实例化类. (3认同)