具体bug报错如下

java.lang.IllegalArgumentException: View=DecorView@4e9c67e[xxxx] nappstoreot attached to window manager
at android.view.WindowMaandroid什么意思nagerGlobal.findGoogleViewLockandroid下载ed(WindowManagerGlobal.java:536)
at android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:445)
at android.view.WindowManagerImpl.removeViewImmediat源码编辑器e(WindowManagerImpl.javagoogle地球:124google)
at android.app.Dialogoogle谷歌搜索主页g.dismissDialog(Dialog.java:410)
at android.app.Dialog.d源码超市ismiss(Dialog.java:393)
at com.xxxx宫颈癌.xxxx.t9.j.close(BaseDialog.java:1)
at com.xx源码之家xx.xxxx.xxxx.xandroid什么意思xxx.dialog.xxxx.close(NewReceiappearveInvitationDialog.jgoogle搜索引擎入口ava:1)
at com.xxxx.xxxx.xxxx.xxxx.xxxx.xgoogle地球xxx.closeNewReceiveInvitationDialoandroid下载软件appg(NewReceiveInvitationDialogUtil.java:2)
at com.youkagames.murdermystery.activity.MainActiGovity$c.run(MainActivity.java:4)
at android.os.Handler.handleCallback(Handler.java:873)
at android.os.Handlgoogle搜索引擎入口erapproach.dispatchMessage(Handler.java:99)
at agoogleplay安卓版下载ndroid.os.Looper.loop(Looper.java:224)
at android.app.ActivityThread.m源码ain(ActivityThread.java:7085)
at java.lang.reflect.Method.invoke(Native Method)
at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:511)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.jav源码编程器appa:928)源码交易网站源码

本地代码如下

        if (dialog != null) {
dialog.close();
}
dialog = null;
```
如上报错我们一个个分析如下
就是在调用dialog的cl工作总结ose方法内部就是调用了dialog的dismiss方法
所以导致报错的原因就是调用了dialog的dismiss方法发生了崩溃,
崩溃的方法链如下
java源码之家.lang.IllegalArgumentandroid平板电脑多少钱Exception: View=DecorView@4e9c67e[xxxx] not attached to window man源码交易网站源码ager
at android.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobagoogle地球l.java:536)
at android.viAPPew.WindowManagerG源码分享网lobal.removeView(Win源码编程器appdowManagerGlobal.java:445)
at android.view.WindowManagerImpl.removeViewImmappstoreediate(WindowManagerImpl源码.java:124)
at android.apapplep.Dialog.dismissDialog(Dialog.java:410)
at android.app.D工商银行ialog.dismiss(Dialog.java:393)
所以我们先去看dialog的dismiss方法
内部调用了dismissDialog
WindowManagerImpl.removeViewImmediate
WindowManagerGlobal.findViewLocked  在这里报的错的
final int index = mViewgoogle空间s.indexOf(view);
if (required && index < 0) {
throw new IllegalArgumentException("View=" +源码交易网站源码 view + " not attached to window manager");
}
return index;
所以也就是index <0 导致的报错
源码里mVie源码交易网站源码ws的格式如下
@UnsGoogleupportedAppUsage
private final ArrayList<View> mViews = new ArrayList源码之家<View>();
通过查找方法调用  只有在 void doRemoveView(googleViewRootImpl root) 内调用了remove方法
所以只要知道doRemoveView这里被哪里调用了就行
本地代码会对dialog进行判空 所以是第二次调用,才会进入到close方法内,所以相对第二次的差别就是中间会调用一次dismiss
所以我猜测的方向就是doRemoveView在dismiss内调用过
这就是我接下来努力查找源Go码的方向,
所以接下来方法调用 dismissDialog ->mWindowManager.removeViewImmediate(mWindowManager 实现是WindowManagerImpl) ->WindowManagerGlobal.removeView(View view, boolean immediatandroid/yunose);
private void removeViewLocked(int index, boolean immediate) {
ViewRootImpl root = mRandroid平板电脑多少钱oots.geandroid是系统软件吗t(index); //这Go里需要补充一下 在addview的时候 会把view同工作细胞时在add到mRoots里一份  所以我们也要注重看一下root的操作  也就是 rootappreciate.die()操作
View viewapprove = root.getView();
if (view != null) {
InputMethodManager imm = view.getContext().getSystemService(android界面设计InputMethodManager.class);
if (imm != null) {
imm.windowDismissed(mViews.get(index).getWindowToken());
}
}
bool源码分享网ean deferredgoogleplay = root.源码分享网die(immediate);
if (view != null) {
view.assignParent(null);
if (deferred) {
mDyingViews.add(view);
}
}
}

最后在ViewRootImpl 内通过handler发送MSG_appearDIE  的doD源码分享网ie()方法内看到调用了 WindowManagerGlobal.getInstanapplicationce().doRemovgoogleeView(this);google地球 也就是我们日思夜想的那个方法
所以最终是印证了  在dismiss内对mView进行了清除
至于如何避免这个bug呢
可以在dismissDialog方法内找到答案
代码如下

vogoogleid dismissDialog() {
if (mDecor == null || !mSgoogle翻译howing) {
return;
}

    if (mWindow.isDestroyed()) {
Log.e(TAG, "Tried to dismissDialog() but the Dialog's wAndroidindow was already destroyed!");
return;
}
try {
mWindowManager.removeViewImmediate(mDecor);
} finally {
if (mActionMode != null) {
mActionMode.finish();
}
mDecor = null;
mWindow.closeAllPanels();
onStandroid什么意思op();
mShoandroid手机wing = false;
sen源码之家dDismissMessage();
}
}

也就是这里

mDecor = null;
mWindow.clogoogle翻译seAllPanels();
onStop();
mShowing = falandroid平板电脑多少钱se;


dialog给我们提供的方法就是
public boolean isShowing() {
return mDecor == null ? false : mDecor.getVisibility() == View.VISIBLE;
}

所以针对我这个bug的解决办法只需在不为null的同时判断一下 Dialog.isShowing() 即可
    if (diaandroid是系统软件吗log != null && dialog.isShowing()) {Google
dialog.close();
}

以上就是通过源码分析一个bug的过程,可能baidu 或者Google更快,但是缺少了过程,在不忙的时候 可以通过源码的报错打印来分析整个流程,从而找到解决办法
最后总结就是  不要在dialog没有创建 或者是源码分享网 已经创建过了但是dismiss后在调用dismiss