美文网首页
安卓主线程关闭弹出的dialog操作系统崩溃,提示运行在错误的线

安卓主线程关闭弹出的dialog操作系统崩溃,提示运行在错误的线

作者: LYX_8716 | 来源:发表于2022-09-26 17:25 被阅读0次

项目中突然遇到一个问题,加载网络请求时,弹出dialog,当网络请求完成时进行关闭,代码看着没什么问题,而且看操作都是在主线程进行的UI操作,但是运行之后就发生了崩溃。

后来查看源码发现,安卓对于UI更新时的线程检查调用的时如下图的方法:

checkThrea();在其中比较了mThread和Thread.currentThread()时否相等,不相等就会抛出异常。

图1-1

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

那么mThread时在哪赋值的呢

图1-2

ViewRootImpl的初始化在 Activity 会在onResume()方法之后,而是 Dialog 被调用show方法时触发的。

所以mThread的赋值是在显示dialog的时候,那么是不是可能在dialog显示的时候线程不是主线程呢,

经过日志查看发现,创建时的线程为子线程,所有在关闭dialog的时候checkThread是发现线程不对应而抛出了异常。

解决方法也很简单,在弹出时就做一个线程校验,如果是在子线程那么就切换到主线程就是展示就可以了。

经过这个问题也发现了一件事情,安卓中js回调的接口大看起来我都好想都是在主线程进行的操作,但是实际上回调接口所在线程为子线程。(js回调到java中的方法是浏览器webView在新开的子线程做的操作,涨见识了)。

相关文章

网友评论

      本文标题:安卓主线程关闭弹出的dialog操作系统崩溃,提示运行在错误的线

      本文链接:https://www.haomeiwen.com/subject/jnafartx.html