【HarmonyOS】关于Caused by java.lang.IllegalStateException The specified …

文章分析了线上手机应用遇到的崩溃异常,主要集中在华为设备上,异常信息指向MessageQueue的同步屏障问题。问题根源在于多线程尝试绘制UI,导致同步屏障的不正确使用。解决方案是检查代码中是否存在多线程刷新UI的行为,确保线程安全。由于Android高版本对此已有所改进,因此可能是代码实现的问题。
摘要由CSDN通过智能技术生成

【问题描述】

线上收到大量手机的崩溃异常,以华为手机为主,崩溃如下

1.Caused by: java.lang.IllegalStateException: The specified message queue synchronization barrier token has not been posted or has already been removed.

2.at android.os.MessageQueue.removeSyncBarrier(MessageQueue.java:600)

3.at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:2822)

4.at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:10653)

5.at android.view.Choreographer$CallbackRecord.run(Choreographer.java:1394)

6.at android.view.Choreographer.doCallbacks(Choreographer.java:1115)

7.at android.view.Choreographer.doFrame(Choreographer.java:1004)

8.at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:1362)

9.at android.os.Handler.handleCallback(Handler.java:966)

10.at android.os.Handler.dispatchMessage(Handler.java:110)

11.at android.os.Looper.loopOnce(Looper.java:205)

12.at android.os.Looper.loop(Looper.java:293)

13.at android.app.ActivityThread.main(ActivityThread.java:9596)

14.at java.lang.reflect.Method.invoke(Native Method)

15.at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:586)

16.at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1204)

【问题分析】

对于“The specified message queue synchronization barrier token has not been posted or has already been removed.”

该问题主要为多线程绘制UI导致的,UI绘制过程会在MessageQueue中设置synchronization barrier ,结束时释放。其中barrier是Android Handler中的同步屏障,不了解的同学可以看下这篇文章Handler消息机制深入解析 | EasyLiu (easyliu-ly.github.io)

【解决方案】

所以这行报错的意思是消息队列中的同步屏障没有被设置或者同步屏障已经被移除,view刷新时一般时是在绘制前插入屏障,绘制后移出屏障,如果多线程同时绘制UI就会导致线程安全问题,MessageQueue中的synchronization barrier 消息可能被另一个线程绘制完成时释放,导致原始线程走到barrier释放流程时,无法找到该消息,最终导致该crash发生。

安卓原生在高版本已经屏蔽了原来在子线程刷新UI会报错的特性,所以发生这种情况需要检查工程中是否有多线程刷新绘制UI的情况,和子线程刷新UI的情况,并非系统问题。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值