1、默认线程没有消息队列
- 默认情况下一个线程是没有消息循环的,需要调用 Looper.prepare()来给线程创建消息循环,然后调用Looper.loop()来使消息循环起作用
Android 环境会自动创建主线程 Looper,开发者不应该自己调用这个方法。 UI线程,它就是 ActivityThread,ActivityThread 被创建时就会初始化 Looper,所以在Activity中新建Handler时,不须要先调用Looper.prepare()
1-1、代码验证
以下代码会报错,java.lang.RuntimeException: Can’t create handler inside thread that has not called Looper.prepare()
new Thread(new Runnable() {
@Override
public void run() {
// 报错 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
Handler handler = new Handler();
}
}).start();
正确写法如下
new Thread(new Runnable() {
@Override
public void run() {
Looper.prepare();
Handler handler = new Handler();
Looper.loop();
}
}).start();
2、⼦线程⼀定不能更新 UI 吗?
答:不⼀定。
Activity存在⼀种审计机制,这个机制会在Activity完全显示之后⼯作,如果⼦线程在Activity完全显示
之前更新UI是可⾏的;
SurfaceView:多媒体视频播放,也可以在⼦线程中更新UI
Progress:进度相关控件,也可以在⼦线程中更新UI 作者:安卓开发好多年
https://www.bilibili.com/read/cv14158988