Loader和onLoaderReset Android

前端之家收集整理的这篇文章主要介绍了Loader和onLoaderReset Android前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我在我的应用程序中实现了一个Loader来查询数据库中的数据.我听到通过实现LoaderCallbacks< Cursor>发生的变化监听器.我的问题是当我的数据更改时使用onLoaderReset(Loader< Cursor> loader)方法,并且我想使与加载程序相关联的任何数据无效.在所有示例中,在此方法中有以下调用

mAdapter.swapCursor(NULL);

但是事情是我不使用光标在适配器中的数据,我以其他方式在我的应用程序中使用它.

(例如,直接从onLoadFinished(Loader< Cursor>加载器,Cursor数据)中的返回的游标)

@Override
        public void onLoadFinished(Loader<Cursor> loader,Cursor data) {

            if (data.moveToFirst()) {
                TOTAL_CARDS = data.getCount();
                mView.createCards(TOTAL_CARDS);
            } else {
                TOTAL_CARDS = 0;
                mView.createCards(TOTAL_CARDS);
            }


        }

在这里做相应的事情是什么,这与mAdapter.swapCursor类似.
我没有太多的装载机经验,其实我刚开始和他们一起工作,所以如果有人解决这个问题,我会很感激.谢谢!

编辑:
现在,我将null传递给加载器,它的工作原理如下:

@Override
public void onLoaderReset(Loader<Cursor> loader) {
        loader = null;
}

};

但这是正确的解决方案吗?

解决方法

@Override
public void onLoaderReset(Loader<Cursor> loader) {
  loader = null;
}

和做什么一样好在您的示例代码中,您只是将方法的本地引用归零.但是,返回方法调用后,此引用将始终被删除. (您可能需要阅读Is Java “pass-by-reference” or “pass-by-value”?以进一步讨论该主题.)

当您的加载程序的回调(通常是一个Activity或Fragment实例)被要求释放通过onLoadFinished(Loader,Cursor)获取的Cursor的所有引用时,onLoaderReset(Loader)方法调用.基本上,这种方法要求您清理,因为装载程序将很快关闭它提供给您的光标.光标关闭后,您将无法再通过它检索数据.如果光标在关闭之后仍然会被使用(通常由您所提到的CursorAdapter),这将导致抛出异常.

类似地,onLoadFinished(Loader,Cursor)有一个隐式合同,要求在方法返回任何以前提供的Cursor对象不能再使用之后.相反,您必须通过作为方法参数提供的新游标来替换这些引用.相比之下,onLoaderReset(Loader)要求您完成相同的合同,但不提供替换,即您应该删除对以前检索的Cursor的所有引用.

在您的示例中,您不要让Cursor转义方法范围,而是立即读取数据.因此,没有必要删除通过onLoadFinished(Loader,Cursor)提供的Cursor对象的任何引用,因为没有.因此,执行onLoaderReset(Loader)以实现接口合同的空的实现将为您做好工作.

猜你在找的Android相关文章