dyl*_*won 5 android memory-leaks leakcanary bottom-sheet
我在 PopupDialog 中发现了内存泄漏,但我不知道为什么。
所以我注释掉了所有被覆盖的方法,但我仍然有漏洞。
class PopupDialog : BottomSheetDialogFragment() {
// Annotated all methods and variable.
}
Run Code Online (Sandbox Code Playgroud)
fun showPopupDialog() =
PopupDialog().show(supportFragmentManager, "DialogTag.POPUP_DIALOG")
Run Code Online (Sandbox Code Playgroud)
如果您点击该Message.obj (excluded)节点,您将看到以下消息。
被规则匹配字段 android.os.Message#obj 排除,因为在阻塞队列上等待的线程会将最后一个出队的对象泄漏为堆栈本地引用。因此,当 HandlerThread 空闲时,它会保留对其收到的最后一条消息的本地引用。然后该消息将被回收并可以再次使用。只要所有消息在使用后都被回收,这就不会成为问题,因为这些引用在回收时会被清除。但是,对话框会创建模板消息实例,以便在需要发送消息时复制。这些消息模板保存对对话框侦听器的引用,这很可能导致以某种方式保存对活动的引用。对话框永远不会回收它们的模板消息,假设这些消息实例在对话框被 GC 时也将被 GC 。一旦您使用对话框,这两件事的结合就会产生很高的内存泄漏可能性。这些内存泄漏可能是暂时的,但某些处理程序线程会休眠很长时间。要解决此问题,您可以不时地将空消息发布到空闲处理程序线程。这并不容易,因为您无法访问所有处理程序线程,但广泛使用的库应该考虑为其自己的处理程序线程执行此操作。这种泄漏已被证明在 Dalvik 和 ART 中都发生过。
正如消息中所建议的,您可以发布到附加到主线程的循环程序的处理程序。您可以在对话框消失后执行此操作。
在主线程上创建的处理程序将附加到主线程的循环程序。
所以你可以做这样的事情
existingHander.post {}
或者创建一个新的处理程序你可以这样做Handler(Looper.getMainLooper()).post {}
| 归档时间: |
|
| 查看次数: |
1381 次 |
| 最近记录: |