Android主线程收不到消息更新的问题分析(线程阻塞,profiler分析自己遇到好问题)

3 篇文章 0 订阅
1 篇文章 0 订阅

Android主线程收不到消息更新的问题分析

在工作中遇到一个问题,录制跟拍视频时,首次进入界面,点击开始录制时,视频播放和录制两个界面会同时开始播放。

接收播放器的回调,通过handler发送给主线程更新UI。

时间更新最小单位是0.1秒。

第一次进入界面,点击播放时,会等待1秒才开始更新进度,显示录制时间。

在同一个界面,删除当前录制内容,重新录制时,则不会等待1秒的时间。

在非UI线程的回调,以及UI线程的Handler消息中加入log,发现log有堆积现象,堆积的时间大约是1s。堆积之后,才开始

怀疑主线程被阻塞了,导致消息发不出来。

在回调函数和handler的消息处理方法中加入log,并带上线程ID,发现回调以及handler更新不在同一个线程中。

应该是主线程被阻塞了

如何查找原因呢?

想想是否可以用profiler的CPU工具(之前都没有这么用,但是感觉这里应该很有用,看callstack,看执行时间等等)

使用profiler,操作第一进入录制和录制之后删除再重新录制。

使用profiler的cpu 工具,点击start record 5s后点击stop record。

对比callstack的图, 发现横轴上 多了一段 长的蓝色线,移动鼠标发现是ThreadSleep 了1秒。觉得罪魁祸首应该是这里了!!!

顺着堆栈向上找,发现可以点击右键,进入代码。

发现是一个蓝牙的BroadcastReceiver的onReceiver接收消息里面有一个sleep(1000)的操作,感觉应该就是这里了。

因为BroadcastReceiver的消息是在主线程执行的,这里为了open 蓝牙sco,打开蓝牙接收设备,sleep了1s,所以这里1s正好阻塞了主线程的消息循环中的消息处理。

联系视频sdk部门的同事,去解决这个问题,不再放在UI线程中去sleep(1000)了

重新试验,问题解决。

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值