我在应用程序中实现了一个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
类似,将在此处执行相应的操作。我没有很多关于装载机的经验,实际上我只是开始与他们合作,所以如果有人对此有解决方案,我将不胜感激。谢谢!
编辑:
现在,我将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"?以获得对该主题的进一步讨论。)
当要求您的加载程序的回调(通常是
onLoaderReset(Loader)
或Activity
实例)释放之前通过Fragment
获得的对Cursor
的所有引用时,将调用onLoadFinished(Loader, Cursor)
方法。基本上,此方法会要求您进行清理,因为Loader
会很快关闭之前提供给您的Cursor
。关闭游标后,您将不再能够通过它检索数据。但是,如果在关闭游标后仍将其使用(通常如您所提到的CursorAdapter
),则将引发异常。同样,
onLoadFinished(Loader, Cursor)
有一个隐式协定,要求在方法返回后,任何以前提供的Cursor
对象都不能再使用。相反,您必须用作为方法参数提供的新游标替换这些引用。相反,onLoaderReset(Loader)
要求您履行相同的契约(Contract),但不提供替代契约(Contract),即您应删除对以前检索到的Cursor
的所有引用。在您的示例中,您不会让
Cursor
逃脱方法范围,而是立即读取数据。因此,由于没有引用,因此没有必要删除对通过Cursor
提供的onLoadFinished(Loader, Cursor)
对象的任何引用。因此,空执行onLoaderReset(Loader)
来实现接口(interface)协定将为您完成这项工作。关于android - 加载器和onLoaderReset Android,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/12937060/