实现AsyncQueryHandler

14
我正在尝试实现AsyncQueryHandler,因为我在这个链接中遇到了与问题链接相同的问题,但我没有看到任何有关实现它的示例或内容。
我尝试过...
AsyncQueryHandler handler = new AsyncQueryHandler(getContentResolver());

因为文档中构造函数展示的是这样的,docs 但我却收到了一个错误,说 cannot instantiate the type AsyncQueryHandler 那么我该怎么使用它呢?


开始学习的好地方将是AOSP源代码。 - JoxTraex
4个回答

17

太方便了:

AsyncQueryHandler handler = 
    new AsyncQueryHandler(mActivity.getContentResolver()) {};
handler.startUpdate(-1, null, sessionUri, values, null, null);

1
当我尝试这样做时,我会收到警告:“此处理程序类应为静态的,否则可能会发生泄漏”。 - Adeel Ahmad

12

当您需要异步执行CRUD操作而不使用Loader时,继承自AsyncQueryHandler非常有用,因此您可以获得诸如startQuerystartInsertstartUpdatestartDelete等方法。一个简单的实现可以是:

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等等。


在执行 CRUD 操作时,为什么你不想使用 Loader 呢? - IgorGanapolsky
3
因为加载程序不适用于 CRUD 操作! - Necronet
3
额外的监听器接口是因为您需要将事件传播回到实例化类。 - Stephen Kaiser
简单而优雅,10倍提升,但为什么要使用WeakReference?在这种情况下没有潜在的内存滥用。 - gor
如果您将这个类作为静态内部类使用,那么弱引用将非常方便。 - zkvarz
显示剩余2条评论

11

0
 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);

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接