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

Why run Handler in main Looper thread

我读到 Android Handler can be used to communicate with the main Looper 线程到 post 将与视图交互的消息(因为只有主线程可以在那里与视图交互)

但是我经常在主线程中看到像下面例子的代码运行 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 {

    }
}

Handler 不仅仅用于与 main Looper 通信。

Looper 是一个 class 循环遍历消息队列并分发它们,每个实例使用一个 Thread.

一个 HandlerThread 是一个 Thread,它还附加了一个 Looper

你申请的"main"Thread也是HandlerThread.

当您使用空构造函数实例化 Handler 时,Handler 将附加到您在其中创建实例的 ThreadLooper。例如,如果您在 ActivityonCreate 中创建 Thread,则 Handler 将附加到主 (UI) Thread 因为生命周期回调在那里执行。

当您调用 post(Runnable) 时,Runnable 将在 HandlerLooper 所附加的线程上 运行。因此,如果您在 Activity 的生命周期回调之一中创建一个 Handler,那么无论您 post 来自哪个 Thread Runnable,它都会总是在 main Thread

上执行

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

上执行

post(Runnable) 的另一个用法(有时是对奇怪的 UI 错误的通用脏修复)是从主线程调用它只是为了延迟执行直到整个方法之后已被处决。

fun onCreate(savedInstanceState: Bundle?) {
    Handler().post {
        // code here is executed after `onCreate` has returned
    }
    // code here is executed before the one posted on the Handler
}