Loaders和onLoaderReset Android

时间:2012-10-17 14:49:03

标签: android loader android-loadermanager

我在我的应用程序中实现了一个Loader来查询数据库中的数据。我通过实现LoaderCallbacks<Cursor>监听器来监听发生的变化。我遇到的问题是当我的数据发生变化时使用onLoaderReset(Loader<Cursor> loader)方法,并且我想要使与加载器相关的任何数据无效并释放。在所有示例中,在此方法中都有以下调用:

mAdapter.swapCursor(null);

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

(例如,直接来自onLoadFinished(Loader<Cursor> loader, Cursor data)中的返回光标)

        @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类似。 我对装载机没有多少经验,事实上我刚开始与他们合作,所以如果有人有解决方案,我会很感激。 THX!

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

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

};

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

1 个答案:

答案 0 :(得分:27)

否则

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

和无所事事一样好。在您的示例代码中,您只是 nulling 您的方法对其参数的本地引用。但是,在返回方法调用后,将始终删除此引用。 (您可能需要阅读Is Java "pass-by-reference" or "pass-by-value"?以进一步讨论该主题。)

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

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

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