为什么我必须在onLoaderReset中使用swapCursor(null)?

时间:2015-06-05 12:09:17

标签: java android garbage-collection android-loadermanager android-loader

Android的文档(https://developer.android.com/guide/components/loaders.html)说当我使用加载器进行SQL查询时,我 应该在onLoaderReset方法中执行swapCursor(null):

  

onLoaderReset   当重置先前创建的加载器时调用此方法,从而使其数据不可用。此回调可让您找出数据即将发布的时间,以便您可以删除对它的引用   此实现调用swapCursor()的值为null:

// 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?

1 个答案:

答案 0 :(得分:2)

如果其基础成员引用活动的一侧,则不会对活动进行垃圾回收。当所有成员未来可能不会被使用时,它将被垃圾收集。
如果swapCursor(null);将使用游标删除所有底层引用。否则它将创建memory leak并且您的活动不会被垃圾收集。