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