POSTING模式下,非UI线程中发布消息,订阅函数更新UI

POSTING模式下,非UI线程中发布消息,订阅函数更新UI

如果说POSTING模式下,发布方和订阅方在同一线程中执行。

那么在非UI中发布消息,如果订阅回调中并没有使用runOnUiThread来更新界面,理论上应该是界面不更新吧!为什么我的会更新呢?

正在回答 回答被采纳积分+1

登陆购买课程后可参与讨论,去登陆

3回答
我有明珠一颗 2024-10-31 07:37:01

posting模式,哪个线程发送,那个线程就接收。非ui线程发布消息,订阅函数更新UI所在的线程也是非ui线程。


非ui线程在一定条件下也可以更新ui。

因为ViewRootImpl 的创建在 onResume 方法回调之后,在 onCreate 方法中创建了子线程并访问 UI,在那个时刻,ViewRootImpl 还没有创建,在子线程写了更新ui代码,虽然可能会触发 View#requestLayout 和 View#invalidate() ,但是由于 ViewRootImpl还未创建出来,因此 ViewRootImpl#checkThread 没有被调用到,也就是说,检测当前线程是否是创建的 UI 那个线程 的逻辑没有执行到,所以程序没有崩溃一样能跑起来。而之后修改了程序,让线程休眠了 300 毫秒后,程序就崩了。很明显 300 毫秒后 ViewRootImpl 已经创建了,可以执行 checkThread 方法检查当前线程。

关键词:ViewRootImpl checkThread

旧日星光 2022-10-12 10:04:47

个人感觉是因为posting是按照第一次发送接收方所在线程定的,所以第一次如果双方都是main线程,他就认为subscriber和publisher可以互相通信,所以就算后面publisher变为了子线程,subscriber依然可以在主线程接收到这条event

好帮手慕雪 2020-05-02 17:12:55

那得看用的什么控件,例如ProgressBar是可以在子线程中更新UI的。它不受线程的影响。祝:学习愉快

  • 提问者 Wanrem #1
    但是我用的是TextView
    2020-05-02 17:22:48
  • 好帮手慕雪 回复 提问者 Wanrem #2
    你把原来APP删除,重新安装运行测试一下,有时它并没有更新。如果还是不对,请把代码粘贴,老师排查一下。
    2020-05-04 09:52:46
  • 好帮手慕雪 回复 提问者 Wanrem #3
    你把原来APP删除,重新安装运行测试一下,有时它并没有更新。如果还是不对,请把代码粘贴,老师排查一下。
    2020-05-04 09:52:58
问题已解决,确定采纳
还有疑问,暂不采纳

恭喜解决一个难题,获得1积分~

来为老师/同学的回答评分吧

0 星
2.Android 网络操作与流行框架
  • 参与学习           人
  • 提交作业       220    份
  • 解答问题       1800    个

本阶段是联网及数据处理的必备技能。课程从网络基础知识到线程间协同工作、异步下载处理;从文件存储、到轻量级数据库SQLite的使用;最后利用最流程的第三方框架助你快速开发企业级APP。

了解课程
请稍等 ...
意见反馈 帮助中心 APP下载
官方微信

在线咨询

领取优惠

免费试听

领取大纲

扫描二维码,添加
你的专属老师