这个问题网上搜一下,大概都是这么回答的;
你的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 ̄)づ
解决了你的问题,记得点赞,没解决,评论区喷我;请加大力度。