项目中突然遇到一个问题,加载网络请求时,弹出dialog,当网络请求完成时进行关闭,代码看着没什么问题,而且看操作都是在主线程进行的UI操作,但是运行之后就发生了崩溃。
后来查看源码发现,安卓对于UI更新时的线程检查调用的时如下图的方法:
checkThrea();在其中比较了mThread和Thread.currentThread()时否相等,不相等就会抛出异常。

打日志发现关闭dialog的时候线程的确为mianThread,那么可能就是mthread不是主线程??
那么mThread时在哪赋值的呢

ViewRootImpl的初始化在 Activity 会在onResume()方法之后,而是 Dialog 被调用show方法时触发的。
所以mThread的赋值是在显示dialog的时候,那么是不是可能在dialog显示的时候线程不是主线程呢,
经过日志查看发现,创建时的线程为子线程,所有在关闭dialog的时候checkThread是发现线程不对应而抛出了异常。
解决方法也很简单,在弹出时就做一个线程校验,如果是在子线程那么就切换到主线程就是展示就可以了。
经过这个问题也发现了一件事情,安卓中js回调的接口大看起来我都好想都是在主线程进行的操作,但是实际上回调接口所在线程为子线程。(js回调到java中的方法是浏览器webView在新开的子线程做的操作,涨见识了)。
网友评论