Activity has leaked window that was originally added

153 阅读1分钟

这个问题网上搜一下,大概都是这么回答的;

你的Dialog或者PopupWindow,在onDestroy调用下dismiss;哎,你要是一试好了,那好吧,你就不用往下看了;

你说,哎,我没用Dialog和PopupWindow呀!怎么还报这个错误;

问题原因:

说到底这个问题是Window的问题,而不是Dialog和PopupWindow的问题,问题描述已经很清楚了,说Activity泄露啦,为啥呢,window还用着呢,销毁不掉啊。

怎么解决呢?

你看下是不是拿windowManager 干啥了,搜一下,大概是用了悬浮窗,windowManager.addView()了,但是你调用了removeView();按理说也好了,不会出现这问题了;但是,但是,但是这不行,不然你也看不到这篇文章;

你调用下removeViewImmediate() 就解决了;注意try catch一下

我怎么知道的?你看下dialog的dismissDialog() 方法你就知道了;

   try {
            mWindowManager.removeViewImmediate(mDecor);
        } finally {
            if (mActionMode != null) {
                mActionMode.finish();
            }
            mDecor = null;
            mWindow.closeAllPanels();
            onStop();
            mShowing = false;

            sendDismissMessage();
        }

调用立刻移除的方法

/**
     * @param immediate True, do now if not in traversal. False, put on queue and do later.
     * @return True, request has been queued. False, request has been completed.
     */
    boolean die(boolean immediate) {
        // Make sure we do execute immediately if we are in the middle of a traversal or the damage
        // done by dispatchDetachedFromWindow will cause havoc on return.
        if (immediate && !mIsInTraversal) {
            doDie();
            return false;
        }

        if (!mIsDrawing) {
            destroyHardwareRenderer();
        } else {
            Log.e(mTag, "Attempting to destroy the window while drawing!\n" +
                    "  window=" + this + ", title=" + mWindowAttributes.getTitle());
        }
        mHandler.sendEmptyMessage(MSG_DIE);
        return true;
    }

最终啊,人家调用了ViewRootImpl.die()方法;

你不传immediate,人家就给你排个队,所以destroy调用removeView()就有点太晚了,所以换成这个吧removeViewImmediate();

好,完事儿了,撤退;么么哒(づ ̄ 3 ̄)づ

解决了你的问题,记得点赞,没解决,评论区喷我;请加大力度。