Lazy loaded image
技术分享
🗒️Android:子线程到底能不能更新UI?
字数 494阅读时长 2 分钟
2020-7-17
2023-10-27
type
status
date
slug
summary
tags
category
icon
password

问题由来

我们知道,Andoird由于修改UI是线程不安全的,只能在主线程中修改。如果多个线程修改UI肯定会花屏,于是谷歌做了限制,只能在主线程中修改UI。但是有次我在子线程中修改了UI没弹异常。
先来看两段代码
闪退,控制台异常为:Only the original thread that created a view hierarchy can touch its views.

源码解读

之前的博客有解读ViewRootImpl是负责View的绘制,在requestLayout这个方法中会检查是否是当前线程。所以只要子线程修改UI但不改变UI布局时,不会弹出非主线程的异常。
那么问题来了,假设我在onCreate的时候修改UI,layout也变了,为什么没报错呢?
在ActivityThread中发现,ViewRootImpl是在onResume的时候被初始化的,上面那段代码sleep久一点等ViewRootImpl初始化完毕就会报错

总结

  1. 子线程可以在部分情况下修改UI,如不改变布局,在onResume之前
  1. 不推荐在子线程中修改UI
上一篇
Android:ListView 和RecyclerView区别
下一篇
Activity、Window、WindowManager、View、ViewRootImpl的作用和相互之间的关系

评论
Loading...