为什么在主Looper线程中运行Handler

时间:2018-12-13 09:29:20

标签: android android-handler

我了解到Android Handler可用于与Looper主线程进行通信以发布将与视图交互的消息(因为只有主线程可以与那里的视图交互)

但是我经常看到类似下面示例的代码在主线程中运行Handler。为什么要做一个好的思考,除非像postDelayed(new Runnable()...

这样的延迟,否则感觉没有必要

任何对此的解释都很好

public class TaleDemoActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_demo);

        new Handler().post(new Runnable() {
            @Override
            public void run() {
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        new Tale("Hello runnables!").tell();
                    }
                });
                new Handler().post(new Runnable() {
                    @Override
                    public void run() {
                        new Tale("Hello runnables!").at().tell();
                    }
                });
            }
        });

        new Handler().post(new TestRunnable());
        new Handler().post(new TestStaticRunnable());

        new Handler().post(new TestAbstractRunnable() {
            @Override
            public void run() {
                new Tale("Hello abstract runnable!").tell();
            }
        });
        new Handler().post(new TestInterfaceRunnable() {
            @Override
            public void run() {
                new Tale("Hello test interface runnable!").tell();
            }
        });

        new Tale().at().tell();
    }

    class TestRunnable implements Runnable {
        @Override
        public void run() {
            new Tale("Hello testRunnable!").tell();
        }
    }

    static class TestStaticRunnable implements Runnable {
        @Override
        public void run() {
            new Tale("Hello testStaticRunnable!").tell();
        }
    }

    abstract class TestAbstractRunnable implements Runnable {

    }

    interface TestInterfaceRunnable extends Runnable {

    }
}

1 个答案:

答案 0 :(得分:2)

Handler不仅用于与 main Looper通信。

Looper是一个类,它遍历消息队列并调度它们,每个实例都使用一个Thread

HandlerThreadThread,并且还附加了Looper

应用程序的“主” Thread也是HandlerThread

使用空的构造函数实例化Handler时,Handler将附加到您要在其中创建实例的Looper的{​​{1}}上。例如,如果您在Thread的{​​{1}}中创建了Thread,则onCreate将附加到主(UI)Activity,因为生命周期回调在那里执行。

当您调用Handler时,Thread将在连接有post(Runnable)的{​​{1}}的线程上运行。因此,如果您在Runnable的生命周期回调之一中创建Handler,则无论您从哪个Looper发布Handler,它都将始终在主要的Activity

这是最常见的用法,它是代码的用途,但不是唯一的用法。例如,您可以实例化一个Thread,然后从Runnable生命周期回调中发布一个执行非常长操作的Thread,并且不会阻塞UI,因为它将在不同的HandlerThread

Activity的另一种用法(有时是针对怪异的UI错误的通用脏修复)是从主线程中调用它,只是为了将执行延迟到整个方法执行之后。

Runnable