Android的文档(https://developer.android.com/guide/components/loaders.html)指出,当我使用加载程序执行SQL查询时,应在onLoaderReset方法中执行swapCursor(null):
onLoaderReset当重置先前创建的加载器,从而使其数据不可用时,将调用此方法。通过此回调,您可以确定何时发布数据,以便删除对数据的引用。
此实现调用值为null的swapCursor():
// This is the Adapter being used to display the list's data.
SimpleCursorAdapter mAdapter;
...
public void onLoaderReset(Loader<Cursor> loader) {
// This is called when the last Cursor provided to onLoadFinished()
// above is about to be closed. We need to make sure we are no
// longer using it.
mAdapter.swapCursor(null);
}
我不明白为什么要在onLoaderReset中将适配器的游标交换为null。据我所知,当活动被破坏时,加载程序会重置。但是,如果活动被销毁,则可以进行垃圾收集,并且该活动保留的所有引用也可以进行垃圾收集。因此,不管这些适配器中的任何一个是否保持对游标的引用-都不会阻止游标被垃圾回收。
那么,为什么要在onLoaderReset中将适配器的游标交换为null?
如果活动的基础成员引用了活动的外部,则不会将其收集为垃圾。当将来可能不再使用其所有成员时,将对其进行垃圾收集。
ifswapCursor(null);
将使用光标删除所有基础引用。否则会造成内存泄漏,并且您的活动将不会被垃圾收集。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句