В Activity произошла утечка окна, которое было добавлено изначально (проблема в суперклассе show())

#java #android

#java #Android

Вопрос:

У меня есть несколько всплывающих окон в приложении. Если я убью приложение при появлении всплывающего окна, я получаю сообщение об ошибке ниже.

 2020-11-26 10:09:25.275 15274-15274/? E/WindowManager: android.view.WindowLeaked: Activity com.myproject.v1.HomeActivity has leaked window DecorView@d75132a[] that was originally added here
    at android.view.ViewRootImpl.<init>(ViewRootImpl.java:418)
    at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:331)
    at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
    at android.app.Dialog.show(Dialog.java:322)
    at com.helper.DialogHelper.show(DialogHelper.java:71)
    at com.myproject.v1.HomeActivity.pointDialog(HomeActivity.java:1592)
    at com.myproject.v1.HomeActivity.onClick_LevelInfo(HomeActivity.java:1604)
    at java.lang.reflect.Method.invoke(Native Method)
    at android.view.View$DeclaredOnClickListener.onClick(View.java:4720)
    at android.view.View.performClick(View.java:5637)
    at android.view.View$PerformClick.run(View.java:22429)
    at android.os.Handler.handleCallback(Handler.java:751)
    at android.os.Handler.dispatchMessage(Handler.java:95)
    at android.os.Looper.loop(Looper.java:154)
    at android.app.ActivityThread.main(ActivityThread.java:6119)
    at java.lang.reflect.Method.invoke(Native Method)
    at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
 

Я видел много подобных проблем в стеке, но они не совпадают с моей проблемой, потому что моя проблема не в классе dialoghelper, а в суперклассе show(). Я пытался решить в dialoghelper увольнение при уничтожении активности, но не исправил bcs, показывающий, что проблема в dialoghelper, но это помощник beforedialog.

Ответ №1:

Представление пытается отобразить диалоговое окно после завершения действия.
Убедитесь, что вы закрыли диалоговое окно перед выходом из действия. Вызовите dismiss() экземпляр диалога, который вы создали перед завершением действия, например, в onPause() или onStop() или onDestroy()
Нравится

 @Override public void onStop() { if (dialog != null) { dialog.dismiss(); }}`.
 

Также убедитесь, что вы null проверяете диалоговое окно перед его отображением.

Нравится if (dialog != null) { dialog.show(); }