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初始化完毕就会报错
总结
- 子线程可以在部分情况下修改UI,如不改变布局,在onResume之前
- 不推荐在子线程中修改UI
- 作者:比尔盖子
- 链接:https://www.connorshen.site/article/2f5ab77a-0f8b-4aa4-9d0b-7d59614c2ca4
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。