我有很多扩展Loader类的加载器类。我在该类中有一个ForceContentObserver。 现在我在我使用代码注册的一些加载器中使用MatrixCursor:
contentResolver.registerContentObserver(uri, true, mObserver);
cursor.registerContentObserver(mObserver);
当我的片段/活动暂停以避免内存泄漏时,是否必须从加载器取消注册内容观察者? 博客文章here声明内容观察者必须取消注册,否则活动/片段可能不会被垃圾收集。
当我们传递活动上下文或我们正在处理活动/片段级别时,此点有效。 但我发现Loader内部保留了Application上下文对象的引用。这意味着不存在内存泄漏的可能性。那么注册/取消注册观察者的所有代码是否真的有必要?
答案 0 :(得分:1)
LoaderManager
实际上会保留一组有限的加载器(没有重复项)。同时,取消注册(尽管游标加载器没有这样做)可能是一个好主意,因为观察者存储在一个普通的ArrayList(而不是WeakReferences)中。这样做的最佳位置是Loader.onStopLoading()
(也许Loader.onAbandon()
),因为此时加载程序不应提供进一步的更改通知。 LoaderManager
会在适当的时候调用这些函数。