Runnable 运行 在哪个线程上运行?

Which thread does Runnable run on?

我想每 100 毫秒更新一次 UI。在 Whosebug 中搜索后,我找到了使用 RunnableHandler 的解决方案,例如

final Handler handler = new Handler();
Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //update UI here

        handler.postDelayed(this, 100);
    }
};
runnable.run();

有效!但我有一些问题:

  1. 这个 Runnable 运行 在哪个线程上? MainThread 还是另一个线程?这是关于 postDelay 的文档

Handler 附加在 MainThread 上,Runnable 运行ning 也在 MainThread 上吗?

  1. 如果 Runnable 在 MainThread 上 运行ning,为什么需要 Handler?据我所知,Handler用于两个线程之间发送消息

Which thread does this Runnable run on?

Runnable runnable = new Runnable() {
    @Override
    public void run() {
        //update UI here

        handler.postDelayed(this, 100);
    }
};
runnable.run()

这个 Runnable 在当前线程上运行,即调用此代码的线程。它不会神奇地创建或构成另一个线程。 Runnable.run() 只是一个方法调用。

此线程的 后续 执行,由 HandlerHandler 运行的任何线程中执行,除了重新安排自己之外,基本上什么都不做。很难相信这是解决任何问题的方法。

在您的示例中,UI 线程上的 Runnable 运行。

如果您希望您的 Handler 及其所有 Runnable 到 运行 在不同的线程中,您必须为其分配一个新的 HandlerThreadLooper

final HandlerThread handlerThread = new HandlerThread(MY_THREAD_ID);
handlerThread.start();
final Handler handler = new Handler(handlerThread.getLooper());

然后您可以通过 postDelayed(Runnable, long) 传递 Runnable 实例。

Runnable r = new Runnable() {
    @Override public void run() {
        handler.postDelayed(this, 2000);
    }   
};

handler.postDelayed(r, 0);

Handler is attached MainThread, so is Runnable running on MainThread?

来自 Handler 文档:

每个 Handler 实例都与一个线程和该线程的消息队列相关联。当您创建一个新的处理程序时,它会绑定到创建它的线程的线程/消息队列——从那时起,它将向该消息队列传递消息和 运行nables 并在它们执行时执行它们从消息队列中出来。

如果你想 运行 你的 Runnable 在不同的线程上,你可以使用 HandlerThread .

相关post:

Why use HandlerThread in Android

If Runnable is running on MainThread, why needs Handler? According to my knowledge, Handler is used to send messages between two threads

处理程序有两个主要用途:

  1. 安排消息并运行能够在未来的某个时间点执行
  2. 将要在不同于您自己的线程上执行的操作排队。

如果您只使用 MainThread,Handler 可用于在将来的某个时间点发送消息。如果您使用不同的线程,Handler 对于线程之间的通信很有用。