首页 > 编程语言 >【HarmonyOS】关于 Caused by java.lang.IllegalStateException The specified...

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

时间:2023-06-06 10:11:37浏览次数:49  
标签:lang ... java barrier Choreographer android os view

【问题描述】

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

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的情况,并非系统问题。

标签:lang,...,java,barrier,Choreographer,android,os,view
From: https://www.cnblogs.com/mayism123/p/17459762.html

相关文章

  • From Java To Kotlin 2:Kotlin 类型系统与泛型
    上期主要分享了FromJavaToKotlin1:空安全、扩展、函数、Lambda。这是FromJava toKotlin 第二期。FromJava toKotlin 关键在于思维的转变。表达式思维Kotlin中大部分语句是表达式。表达式思维是一种编程思维。编程思维是一种非常抽象的概念,很多时候是只......
  • javascript笔记
    javascript笔记获得焦点onfocus,失去焦点onblurisNaN()判断是非数字undefined和数字相加最后的结果是NaNnull和数字相加最后的结果是数字typeof空格变量名或typeof(变量名)可以检测变量的类型parseInt('120.8px')最后的结果是120->数字;自动去掉px......
  • 43基于java的校园社团管理系统设计与实现
    本章节给大家带来一个基于java的校园社团管理系统设计与实现,可适用于校园社团管理系统,社团招新管理系统,社团管理系统,社团活动管理系统,高校学生社团,大学社团,学生社团招新,学生社团系统等等;引言校园社团作为高校课外活动的重要组成部分,发展十分迅速,也受到越来越多学生的欢迎,社团......
  • Dapr在Java中的实践 之 服务调用
    服务调用通过服务调用(Service-to-serviceInvocation),服务可以使用gRPC或HTTP这样的标准协议来发现并可靠地与其他服务通信。Dapr采用边车(Sidecar)、去中心化的架构。要使用Dapr来调用服务,可以在任意Dapr实例上使用invoke这个API。边车编程模型鼓励每个服务与自己的Dapr实例......
  • Java-Day-27( Properties 类 + 章节练习 )
    Java-Day-27Properties类程序读取xx.properties配置文件,修改的话就通过配置文件将信息写入到程序(非写死在程序中,灵活性差,编译代价大)传统方法:publicclassTest{publicstaticvoidmain(String[]args)throwsIOException{//传统方法//读取db.......
  • GYM100212B - I Just Called...
    大模拟。首先的难度在于理解题意:打电话的地点分为镇、地区、超级地区三级。其中,一些地区是被网络连接的。电话号码的前缀由地区号+镇号组成。它们可以是不等长的,但是整个电话号码的长度是\(d\)。一个镇可能有多个镇号,不同地区的镇可以拥有相同的镇号,但地区号是唯一的。同时......
  • Java官方笔记7接口
    接口接口只能包含:constants,methodsignatures(abstract),defaultmethods,staticmethods,andnestedtypes方法体只存在于:defaultmethodsandstaticmethods接口不能实例化,只能被类实现,或者被其他接口继承(接口可以多继承)。定义接口:publicinterfaceOperateCar{/......
  • 【Java】再谈Springboot 策略模式
     第一次使用策略模式是一年前的一个项目:https://www.cnblogs.com/mindzone/p/16046538.html当时还不知道Spring支持集合类型的自动装配在最近一个项目,我发现很多业务需要频繁的使用这种模式去聚合代码 一、牛刀小试这是最开始的定义策略的业务接口/***业务推送管......
  • TypeScript Vs JavaScript 区别
    一、观察1.JS平常的复制类型letval;val=123;val="123";val=true;val=[1,3,5];注意点:由于JS是弱类型的,所以只要定义了一个变量,就可以往这个变量中存储任意类型的数据也正是因为如此,所以会给我们带来一个问题2.假设a是一个数组,b是一个数值func......
  • Elastic_Search 和java的入门结合
    1,pom文件添加依赖... 2,config配置文件  3,写接口文件 ......