我在我的应用程序中实现了一个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;
}
};
但这是正确的解决方案吗?
答案 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)
空实现将为您完成工作。