设备旋转时打开Activity泄漏窗口的选项菜单

7

尝试理解我的Activity中窗口泄漏的原因。该Activity扩展了AppCompatActivity。它有一个单一视图,其中包含一个RecyclerView和一个ProgressBar,在旋转时不可见。

@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    if (savedInstanceState != null) {
        chosenSorting = savedInstanceState.getString("sorting");
    }

    mRecyclerView = (RecyclerView) findViewById(R.id.rv_pop_view);
    mLoadingIndicator = (ProgressBar) findViewById(R.id.pb_loading_indicator);
    RecyclerView.LayoutManager mLayoutManager = new GridLayoutManager(this, 2);
    moviesRecyclerView.setLayoutManager(mLayoutManager);

    mRecyclerView.setHasFixedSize(true);

    if (chosenSorting.equals("")) {
        load("A");
    } else {
        load("B");
    }
}

屏幕旋转时一切都正常,没有UI问题。 但是当旋转发生而OptionsMenu打开时,会出现窗口泄漏

E/WindowManager: android.view.WindowLeaked: Activity com.example.MainActivity has leaked window android.widget.PopupWindow$PopupDecorView{2aeb62a V.E...... ......ID 0,0-686,336} 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.widget.PopupWindow.invokePopup(PopupWindow.java:1378)
                                                                                at android.widget.PopupWindow.showAsDropDown(PopupWindow.java:1234)
                                                                                at android.support.v7.widget.AppCompatPopupWindow.showAsDropDown(AppCompatPopupWindow.java:105)
                                                                                at android.support.v4.widget.PopupWindowCompatKitKat.showAsDropDown(PopupWindowCompatKitKat.java:33)
                                                                                at android.support.v4.widget.PopupWindowCompat$KitKatPopupWindowImpl.showAsDropDown(PopupWindowCompat.java:129)
                                                                                at android.support.v4.widget.PopupWindowCompat.showAsDropDown(PopupWindowCompat.java:206)
                                                                                at android.support.v7.widget.ListPopupWindow.show(ListPopupWindow.java:721)
                                                                                at android.support.v7.view.menu.StandardMenuPopup.tryShow(StandardMenuPopup.java:160)
                                                                                at android.support.v7.view.menu.StandardMenuPopup.show(StandardMenuPopup.java:187)
                                                                                at android.support.v7.view.menu.MenuPopupHelper.showPopup(MenuPopupHelper.java:290)
                                                                                at android.support.v7.view.menu.MenuPopupHelper.tryShow(MenuPopupHelper.java:175)
                                                                                at android.support.v7.widget.ActionMenuPresenter$OpenOverflowRunnable.run(ActionMenuPresenter.java:803)
                                                                                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:6121)
                                                                                at java.lang.reflect.Method.invoke(Native Method)
                                                                                at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:889)
                                                                                at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:779) 

这是问题吗?:

at android.support.v7.widget.ActionMenuPresenter$OpenOverflowRunnable.run(ActionMenuPresenter.java:803)

将主要UI元素设置为nullcloseOptionsMenu()并不能帮助解决问题...
@Override
protected void onDestroy() {
    closeOptionsMenu();
    mRecyclerView = null;
    mAdapter = null;
    mLoadingIndicator = null;

    super.onDestroy();
}

问题:为什么在屏幕旋转时打开OptionsMenu会导致窗口泄漏,如何避免?


两年后,我遇到了同样的问题,似乎没有人找到解决方案。我尝试过触摸事件,在不同的时间使用closeOptionsWindow(),但都无济于事。当屏幕旋转时,菜单也会重新出现,因此显然没有被关闭。 - Brian Reinhold
1个回答

0

如果 EditText 视图有选择(带有“复制...”弹出对话框)并且您旋转设备,则会引发相同的异常。

这是在targetSdkVersion 28,minSdkVerion 22和运行于v28(Pixel 2)的androidx上发生的,但在v22(Nexus 7)上运行时不会发生。

2019-06-12 16:08:06.392 30838-30838 E/WindowManager: android.view.WindowLeaked: Activity com.hanafey.testing.flexedit.MainActivity has leaked window android.widget.PopupWindow$PopupDecorView{2c0d944 V.E...... R....... 0,0-1029,168} that was originally added here
        at android.view.ViewRootImpl.<init>(ViewRootImpl.java:511)
        at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:346)
        at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
        at android.widget.PopupWindow.invokePopup(PopupWindow.java:1434)
        at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1203)
        at android.widget.PopupWindow.showAtLocation(PopupWindow.java:1170)
        at com.android.internal.widget.FloatingToolbar$FloatingToolbarPopup.show(FloatingToolbar.java:598)
        at com.android.internal.widget.FloatingToolbar.doShow(FloatingToolbar.java:288)
        at com.android.internal.widget.FloatingToolbar.show(FloatingToolbar.java:218)
        at com.android.internal.view.FloatingActionMode$FloatingToolbarVisibilityHelper.updateToolbarVisibility(FloatingActionMode.java:378)
        at com.android.internal.view.FloatingActionMode$1.run(FloatingActionMode.java:67)
        at android.os.Handler.handleCallback(Handler.java:873)
        at android.os.Handler.dispatchMessage(Handler.java:99)
        at android.os.Looper.loop(Looper.java:193)
        at android.app.ActivityThread.main(ActivityThread.java:6718)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)
2019-06-12 16:08:06.418 30838-30838 E/MA: onCreate:wt=0 CODENAME=REL SDK_INT=28 RELEASE=9 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接