android - PopupMenu PopupWindow$PopupViewContainer 泄漏

标签 android memory-leaks popupmenu

我有一个 PopupMenu 锚定到操作栏中的一个按钮,并且我正在获取有关泄漏窗口的日志输出。

如果在 PopupMenu 打开时我的 Activity 停止,就会发生这种情况。

我发布了一个相关问题 here ,但我已经解决了这个问题。

我见过一些类似的问题,比如 this , 但与 PopupMenu 无关。

我在想,如果我可以处理提到的 PopupWindow$PopupViewContainer,那么我可以在 onPause 或类似的过程中将其从 WindowManager 中删除,但我不知道如何得到它。 PopupMenu 公开的接口(interface)非常有限。

  • 有人遇到过这个问题吗?
  • 是否有人修复或解决了它?
  • 有人知道如何获取PopupMenuViewWindow 吗?

这是我创建菜单的方式:

// in Activity
@Override
public boolean onCreateOptionsMenu(Menu menu) {
    super.onCreateOptionsMenu(menu);
    final MenuInflater inflater = getMenuInflater();

    inflater.inflate(R.menu.main_menu, menu);
    MenuItem login = menu.findItem(R.id.menu_login);
    final Button button = (Button) login.getActionView().findViewById(R.id.login);

    button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View item) {
            if (profileMenu == null) {
                // I've tried passing getApplicationContext() here too, with no change
                profileMenu = new PopupMenu(ListActivity.this, button);
                profileMenu.getMenuInflater().inflate(R.menu.profile_menu, profileMenu.getMenu());
                profileMenu.setOnMenuItemClickListener(new PopupMenu.OnMenuItemClickListener() {
                    public boolean onMenuItemClick(MenuItem item) {
                        // there was code here, but I removed it and problem persists
                        return false;
                    }
                });
            }
            profileMenu.show();

        }
    });

这是完整的堆栈跟踪:

10-24 11:10:13.878: E/WindowManager(2048): Activity **.app.ListActivity has leaked window android.widget.PopupWindow$PopupViewContainer@4157a7e8 that was originally added here
10-24 11:10:13.878: E/WindowManager(2048): android.view.WindowLeaked: Activity **.app.ListActivity has leaked window android.widget.PopupWindow$PopupViewContainer@4157a7e8 that was originally added here
10-24 11:10:13.878: E/WindowManager(2048):  at android.view.ViewRootImpl.<init>(ViewRootImpl.java:374)
10-24 11:10:13.878: E/WindowManager(2048):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
10-24 11:10:13.878: E/WindowManager(2048):  at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
10-24 11:10:13.878: E/WindowManager(2048):  at android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
10-24 11:10:13.878: E/WindowManager(2048):  at android.widget.PopupWindow.invokePopup(PopupWindow.java:988)
10-24 11:10:13.878: E/WindowManager(2048):  at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:897)
10-24 11:10:13.878: E/WindowManager(2048):  at android.widget.ListPopupWindow.show(ListPopupWindow.java:595)
10-24 11:10:13.878: E/WindowManager(2048):  at com.android.internal.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:127)
10-24 11:10:13.878: E/WindowManager(2048):  at com.android.internal.view.menu.MenuPopupHelper.show(MenuPopupHelper.java:100)
10-24 11:10:13.878: E/WindowManager(2048):  at android.widget.PopupMenu.show(PopupMenu.java:108)
10-24 11:10:13.878: E/WindowManager(2048):  at **.app.ListActivity$3.onClick(ListActivity.java:376)
10-24 11:10:13.878: E/WindowManager(2048):  at android.view.View.performClick(View.java:4084)
10-24 11:10:13.878: E/WindowManager(2048):  at android.view.View$PerformClick.run(View.java:16966)
10-24 11:10:13.878: E/WindowManager(2048):  at android.os.Handler.handleCallback(Handler.java:615)
10-24 11:10:13.878: E/WindowManager(2048):  at android.os.Handler.dispatchMessage(Handler.java:92)
10-24 11:10:13.878: E/WindowManager(2048):  at android.os.Looper.loop(Looper.java:137)
10-24 11:10:13.878: E/WindowManager(2048):  at android.app.ActivityThread.main(ActivityThread.java:4745)
10-24 11:10:13.878: E/WindowManager(2048):  at java.lang.reflect.Method.invokeNative(Native Method)
10-24 11:10:13.878: E/WindowManager(2048):  at java.lang.reflect.Method.invoke(Method.java:511)
10-24 11:10:13.878: E/WindowManager(2048):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-24 11:10:13.878: E/WindowManager(2048):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-24 11:10:13.878: E/WindowManager(2048):  at dalvik.system.NativeStart.main(Native Method)

最佳答案

只需调用 profileMenu.dismiss() onStop() 就足够了。

关于android - PopupMenu PopupWindow$PopupViewContainer 泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13055479/

相关文章:

java - 在 Android 中将调用转发到语音信箱?

android - 处理弹出菜单项单击

ios - Table Cell 子类从未发布?

c++ - vector<string> 和 map<string,int> 可能在释放时失败?想知道内存使用细节

ruby - 查找 Ruby 中内存泄漏的原因

java - 弹出菜单项图标

android - 如何将弹出菜单项的方向从右更改为左?

Android sharedPreferences设置默认值问题

android - 从图库中选择图像或从相机拍摄

android - 如何通过 Retrofit 在 @Query 中传递自定义枚举?