小编Tri*_* Le的帖子

android.widget.PopupWindow$PopupDecorView 在菜单打开的情况下旋转设备时泄漏

几周前我开始了 Android 开发,并完成了在 Activity 中创建菜单的过程,并阅读了有关 Activity 生命周期的信息。当我打开弹出菜单并旋转设备时,我一直遇到这个内存泄漏错误。

我最初在一个更大的项目中遇到了这个问题,但为了简化重新创建问题,可以按照以下步骤操作:

  • 我在 Android Studio 中创建了一个我的应用程序项目,让它检查手机和平板电脑的最低 SDK API 16 -> 选择基本活动模板 -> 保留默认值(MainActivity 等...)

  • 没有修改代码,我在我的 Nexus 5 手机上运行它(设备上安装了 Android 6.0)(截图

  • 点击设置菜单(截图)然后旋转我的手机

  • 然后我看到这个错误出现在 Android Monitor 窗口中。

com.example.myapplication E/WindowManager: android.view.WindowLeaked: Activity com.example.myapplication.MainActivity 已经泄露了窗口 android.widget.PopupWindow$PopupDecorView{36b6390 VE..... ......ID 0, 0-588,144} 最初添加在这里...

我知道这与 Activity 在设备旋转过程中经历了 onPause()、onStop() 和 onDestroyed() 相关,并且 PopupWindow$PopupDecorView 没有关闭。从某种意义上说,它类似于这里的问题 [PopupMenu PopupWindow$PopupViewContainer 泄漏](PopupMenu PopupWindow$PopupViewContainer 泄漏)但是我不知道如何解决它,因为我在这些生命周期方法中没有对菜单的引用让它被驳回。

我的另一个问题是,由于菜单被广泛使用,Android 是否应该自动处理这个问题?我浏览了几个关于如何创建菜单的教程,每个人都展示了如何在不提及上述问题的情况下创建菜单。

希望有人能给我解决这个烦人的问题的线索,或者至少如何在生命周期方法之一中关闭弹出菜单。

主活动.java

package com.example.myapplication;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import …
Run Code Online (Sandbox Code Playgroud)

android memory-leaks menu popup android-studio-2.2

5
推荐指数
1
解决办法
1829
查看次数

标签 统计

android ×1

android-studio-2.2 ×1

memory-leaks ×1

menu ×1

popup ×1