dialog 引发的问题 com.android.internal.policy.PhoneWindow$DecorView not attached to window

本文深入探讨了在Android开发中遇到的Dialog dismiss时抛出View not attached to window manager异常的原因。文章详细分析了Dialog的工作原理及与Activity的关系,解释了为何在Activity被销毁后尝试dismiss Dialog会导致该异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值