java.lang.IllegalStateException: Fatal Exception thrown on Scheduler.io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:111)android.os.Handler.handleCallback(Handler.java:739)android.os.Handler.dispatchMessage(Handler.java:95)android.os.Looper.loop(Looper.java:148)android.app.ActivityThread.main(ActivityThread.java:5417)java.lang.reflect.Method.invoke(Native Method)com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)Caused by : java.lang.IllegalArgumentException: View=com.android.internal.policy.PhoneWindow$DecorView{6b82c51 V.E...... R.....I. 0,0-0,0} not attached to window managerandroid.view.WindowManagerGlobal.findViewLocked(WindowManagerGlobal.java:424)android.view.WindowManagerGlobal.removeView(WindowManagerGlobal.java:350)android.view.WindowManagerImpl.removeViewImmediate(WindowManagerImpl.java:116)android.app.Dialog.dismissDialog(Dialog.java:362)android.app.Dialog.dismiss(Dialog.java:345)com.multilotto.lottery.net.RxObserver.onComplete(RxObserver.java:89)io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.checkTerminated(ObservableObserveOn.java:281)io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.drainNormal(ObservableObserveOn.java:192)io.reactivex.internal.operators.observable.ObservableObserveOn$ObserveOnObserver.run(ObservableObserveOn.java:252)io.reactivex.android.schedulers.HandlerScheduler$ScheduledRunnable.run(HandlerScheduler.java:109)
为什么会出现Long Msg: java.lang.IllegalArgumentException: View=com.android.internal.policy.impl.PhoneWindow$DecorView{21dd6762 V.ED.... R......D 0,0-538,105} not attached to window manager的问题呢?应用本身的崩溃怎么会联系到
为什么会报View not attached to window manager错误?
这个错误的意思是说我们所操作的View没有被纳入window manager的管理。
我 们知道所有的窗口创建和管理都是依附于window manager的,因此Dialog的创建也不例外。Dialog的创建流程通过查看源码可以知道,在Dialog的构造函数中,创建了一个Window 对象,但我们知道Window对象并不是用于显示的,真正用于显示的是View对象。因此通过Dialog的show方法构造了一个mDecor的 View对象,并最终通过WindowManager的addView()方法显示Dialog。
通过查看log信息我们可以看到PainterDrawActivity.closeProgressDialog(PainterDrawActivity.java:60)查看对应的closeProgressDialog代码后发现,在60行处代码为dialog.dismiss();
在网络上搜索后发现,多数情况下出现这种错误,都是在dismiss Dialog时,发现创建该Dialog的Activity存在而导致的。
比如在界面上显示一个 Dialog,当任务处理结束后再Dismiss Dialog。如果在Dialog显示期间,该Activity因为某种原因被杀掉且又重新启动了,那么当任务结束时,Dismiss Dialog的时候WindowManager检查,就会发现该Dialog所属的Activity已经不存在了(重新启动了一次,是一个新的 Activity),所以会报IllegalArgumentException: View not attached to window manager.
通过以上分析我们可以知道在Dialog在执行dismiss方法时,发现启动它的Activity已经不见了,被杀掉了(现在这个是重新启动的),所以才报错出现异常。
在Activity被杀掉时,Dialog存在么?
可能大家会有疑问,Dialog都没有看到,就出现错误了,怎么能确定该Dialog当时一定是显示的呢?
其实Activity在被销毁时,其所依附的Dialog是存在的。
解决方案:1.dialog 跟随 activity 的生命周期 在 ondestroy的时候 dissmiss
2.自己管理,在处理完事务后无论是正常或异常处理后都要 清楚dialog