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()

    1. new Thread(new Runnable() {
    2. @Override
    3. public void run() {
    4. // 报错 java.lang.RuntimeException: Can't create handler inside thread that has not called Looper.prepare()
    5. Handler handler = new Handler();
    6. }
    7. }).start();
  • 正确写法如下

    1. new Thread(new Runnable() {
    2. @Override
    3. public void run() {
    4. Looper.prepare();
    5. Handler handler = new Handler();
    6. Looper.loop();
    7. }
    8. }).start();

2、⼦线程⼀定不能更新 UI 吗?

答:不⼀定。

Activity存在⼀种审计机制,这个机制会在Activity完全显示之后⼯作,如果⼦线程在Activity完全显示
之前更新UI是可⾏的;

SurfaceView:多媒体视频播放,也可以在⼦线程中更新UI
Progress:进度相关控件,也可以在⼦线程中更新UI 作者:安卓开发好多年
https://www.bilibili.com/read/cv14158988