Android PopupMenu PopupWindow$PopupViewContainer泄漏

Android PopupMenu PopupWindow$PopupViewContainer泄漏,android,memory-leaks,popupmenu,Android,Memory Leaks,Popupmenu,我有一个弹出菜单锚定在操作栏中的一个按钮上,我得到了关于泄漏窗口的日志输出 如果我的活动在弹出菜单打开时停止,则会发生这种情况 我发布了一个相关的问题,但我已经解决了这个问题 我见过一些类似的问题,比如,但是没有一个与弹出菜单相关 我在想,如果我能得到上面提到的PopupWindow$PopupViewContainer的句柄,那么我可以在onPause或类似的过程中将其从WindowManager中删除,但我不知道如何获得它。PopupMenu公开的界面非常有限 有人遇到过这个问题吗 有没有

我有一个
弹出菜单
锚定在操作栏中的一个按钮上,我得到了关于泄漏窗口的日志输出

如果我的活动在
弹出菜单
打开时停止,则会发生这种情况

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

我见过一些类似的问题,比如,但是没有一个与
弹出菜单相关

我在想,如果我能得到上面提到的
PopupWindow$PopupViewContainer
的句柄,那么我可以在onPause或类似的过程中将其从
WindowManager
中删除,但我不知道如何获得它。
PopupMenu
公开的界面非常有限

  • 有人遇到过这个问题吗
  • 有没有人修理过它或是在它周围工作过
  • 有人知道如何获取
    弹出菜单
    视图
    窗口
以下是我创建菜单的方式:

// 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)
10-24 11:10:13.878:E/WindowManager(2048):活动**.app.ListActivity泄露了窗口android.widget.PopupWindow$PopupViewContainer@4157a7e8原来是加在这里的
10-24 11:10:13.878:E/WindowManager(2048):android.view.WindowLeaked:Activity**.app.ListActivity已泄漏窗口android.widget.PopupWindow$PopupViewContainer@4157a7e8原来是加在这里的
10-24 11:10:13.878:E/WindowManager(2048):在android.view.ViewRootImpl。(ViewRootImpl.java:374)
10-24 11:10:13.878:E/WindowManager(2048):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:292)
10-24 11:10:13.878:E/WindowManager(2048):在android.view.WindowManagerImpl.addView(WindowManagerImpl.java:224)
10-24 11:10:13.878:E/WindowManager(2048):在android.view.WindowManagerImpl$CompatModeWrapper.addView(WindowManagerImpl.java:149)
10-24 11:10:13.878:E/WindowManager(2048):在android.widget.PopupWindow.invokePopup(PopupWindow.java:988)
10-24 11:10:13.878:E/WindowManager(2048):在android.widget.PopupWindow.showas下拉列表(PopupWindow.java:897)
10-24 11:10:13.878:E/WindowManager(2048):在android.widget.ListPopupWindow.show(ListPopupWindow.java:595)
10-24 11:10:13.878:E/WindowManager(2048):位于com.android.internal.view.menu.menupopopuphelper.tryShow(MenuPopupHelper.java:127)
10-24 11:10:13.878:E/WindowManager(2048):在com.android.internal.view.menu.menupopopupherper.show(menupopupherper.java:100)
10-24 11:10:13.878:E/WindowManager(2048):在android.widget.PopupMenu.show(PopupMenu.java:108)
10-24 11:10:13.878:E/WindowManager(2048):在**.app.ListActivity$3.onClick(ListActivity.java:376)
10-24 11:10:13.878:E/WindowManager(2048):在android.view.view.performClick(view.java:4084)上
10-24 11:10:13.878:E/WindowManager(2048):在android.view.view$PerformClick.run(view.java:16966)
10-24 11:10:13.878:E/WindowManager(2048):在android.os.Handler.handleCallback(Handler.java:615)
10-24 11:10:13.878:E/WindowManager(2048):在android.os.Handler.dispatchMessage(Handler.java:92)上
10-24 11:10:13.878:E/WindowManager(2048):在android.os.Looper.loop(Looper.java:137)
10-24 11:10:13.878:E/WindowManager(2048):在android.app.ActivityThread.main(ActivityThread.java:4745)
10-24 11:10:13.878:E/WindowManager(2048):位于java.lang.reflect.Method.Invokenactive(本机方法)
10-24 11:10:13.878:E/WindowManager(2048):位于java.lang.reflect.Method.invoke(Method.java:511)
10-24 11:10:13.878:E/WindowManager(2048):位于com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
10-24 11:10:13.878:E/WindowManager(2048):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
10-24 11:10:13.878:E/WindowManager(2048):在dalvik.system.NativeStart.main(本机方法)

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

对我来说,在onDestroy()中使用Dismise()没有帮助

这是用PopupMenu解决窗口泄漏问题的唯一方法 要删除进入/退出转换,我将其替换为popupAnimationStyle

解决了窗口泄漏的问题

<item name="android:popupEnterTransition">@null</item>
<item name="android:popupExitTransition">@null</item>
<item name="android:popupAnimationStyle">@style/PopupMenuAnimation</item>
    
<style name="PopupMenuAnimation">
    <item name="android:windowEnterAnimation">@anim/slide_up_bottom</item>
    <item name="android:windowExitAnimation">@anim/slide_down_bottom</item>
</style>
@null
@空的
@样式/弹出菜单动画
@动画/向上滑动\u底部
@动画/向下滑动\u底部

Ha!的确如此。显然,调用
settingsMenu.disease()
并不会关闭
profileMenu
。(>.Works,在Android 4.4.4上测试。当弹出菜单打开时旋转屏幕时,股票计算器Android应用程序在Logcat中给出相同的异常:“Android.view.WindowLeaked:Activity com.Android.calculator2.Calculator已泄漏窗口Android.widget.popupindow$PopupViewContainer”。在Android 4.4上测试。