我是否在Loaders中取消注册/取消注册ContentObserver以避免内存泄漏

时间:2015-08-12 16:07:39

标签: android android-fragments memory-leaks android-loadermanager android-loader

我有很多扩展Loader类的加载器类。我在该类中有一个ForceContentObserver。 现在我在我使用代码注册的一些加载器中使用MatrixCursor:

contentResolver.registerContentObserver(uri, true, mObserver);
cursor.registerContentObserver(mObserver);

当我的片段/活动暂停以避免内存泄漏时,是否必须从加载器取消注册内容观察者? 博客文章here声明内容观察者必须取消注册,否则活动/片段可能不会被垃圾收集。

当我们传递活动上下文或我们正在处理活动/片段级别时,此点有效。 但我发现Loader内部保留了Application上下文对象的引用。这意味着不存在内存泄漏的可能性。那么注册/取消注册观察者的所有代码是否真的有必要?

1 个答案:

答案 0 :(得分:1)

LoaderManager实际上会保留一组有限的加载器(没有重复项)。同时,取消注册(尽管游标加载器没有这样做)可能是一个好主意,因为观察者存储在一个普通的ArrayList(而不是WeakReferences)中。这样做的最佳位置是Loader.onStopLoading()(也许Loader.onAbandon()),因为此时加载程序不应提供进一步的更改通知。 LoaderManager会在适当的时候调用这些函数。