打开OptionsMenu of Activity泄漏设备旋转窗口

Oss*_*sen 6 android memory-leaks screen-rotation options-menu android-windowmanager

试图了解我的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");
    }
}
Run Code Online (Sandbox Code Playgroud)

屏幕旋转一切正常,没有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) 
Run Code Online (Sandbox Code Playgroud)

这是问题吗?:

at android.support.v7.widget.ActionMenuPresenter$OpenOverflowRunnable.run(ActionMenuPresenter.java:803)
Run Code Online (Sandbox Code Playgroud)

将主UI元素设置为null并且closeOptionsMenu()没有帮助...

@Override
protected void onDestroy() {
    closeOptionsMenu();
    mRecyclerView = null;
    mAdapter = null;
    mLoadingIndicator = null;

    super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)

问题:打开的OptionsMenu如何导致屏幕旋转时窗口泄漏以及如何避免它?

Mik*_*fey 0

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

这是在 v28 (Pixel 2) 上运行的 targetSdkVersion 28、minSdkVerion 22 和 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 
Run Code Online (Sandbox Code Playgroud)