BottomSheetDialogFragment утечка памяти (используйте утечку информации)
Я обнаружил утечку памяти в моем PopupDialog, но я не знаю почему.
Поэтому я закомментировал все переопределенные методы, но у меня все еще есть утечка.
BottomSheetDialog
class PopupDialog : BottomSheetDialogFragment() {
// Annotated all methods and variable.
}
Деятельность
fun showPopupDialog() =
PopupDialog().show(supportFragmentManager, "DialogTag.POPUP_DIALOG")
leakcanary
0 ответов
Если вы нажмете на Message.obj (excluded)
узел вы увидите следующее сообщение.
Исключено из поля сопоставления правил android.os.Message#obj, поскольку поток, ожидающий в очереди блокировки, утечет последний удаленный объект в качестве локальной ссылки стека. Поэтому, когда HandlerThread становится бездействующим, он сохраняет локальную ссылку на последнее полученное сообщение. Это сообщение затем перерабатывается и может быть использовано снова. Пока все сообщения перерабатываются после использования, это не будет проблемой, потому что эти ссылки очищаются при переработке. Однако в диалоговых окнах создаются шаблоны экземпляров сообщений, которые необходимо скопировать, когда сообщение необходимо отправить. Эти шаблоны сообщений содержат ссылки на прослушиватели диалогов, что, скорее всего, приводит к тому, что ссылка каким-либо образом сохраняется на действии. Диалоги никогда не перезаписывают свой шаблон сообщения, при условии, что эти экземпляры сообщения получат GCed, когда диалог GCed. Сочетание этих двух вещей создает высокий потенциал для утечек памяти, как только вы используете диалоги. Эти утечки памяти могут быть временными, но некоторые потоки обработчиков спят в течение длительного времени. Чтобы это исправить, вы можете время от времени публиковать пустые сообщения в потоках неработающего обработчика. Это будет непросто, потому что вы не можете получить доступ ко всем потокам обработчиков, но широко используемая библиотека должна рассмотреть возможность сделать это для своих собственных потоков обработчиков. Эта утечка, как было показано, происходит как в Dalvik, так и в ART.
Как указано в сообщении, вы можете отправить сообщение обработчику, прикрепленному к петлеру основного потока. Вы сделаете это после закрытия диалогового окна.
Обработчик, созданный в главном потоке, будет присоединен к петлителю основного потока.
Так что вы могли бы сделать что-то вроде этогоexistingHander.post {}
или для создания нового обработчика вы можете сделать это Handler(Looper.getMainLooper()).post {}