Runnable运行哪个线程?

时间:2017-12-06 08:49:23

标签: java android multithreading handler runnable

我想每100毫秒更新一次UI。在StackOverflow中搜索后,我找到了使用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的文档 enter image description here
  2. Handler附加了MainThread,在MainThread上运行了Runnable吗?

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

3 个答案:

答案 0 :(得分:5)

  

此Runnable运行的是哪个线程?

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

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

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

<{1}}执行此线程的后续,在Handler运行的任何线程中,除了重新安排自己之外基本上什么也没做。很难相信这是任何解决方案。

答案 1 :(得分:0)

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

如果您希望Handler及其所有Runnable在其他主题中投放,则必须为其分配一个新的HandlerThread Looper

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

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

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

handler.postDelayed(r, 0);

答案 2 :(得分:0)

  

Handler附加了MainThread,Runnable是否在MainThread上运行?

来自Handler文档:

每个Handler实例都与一个线程和该线程的消息队列相关联。当您创建一个新的Handler时,它被绑定到正在创建它的线程的线程/消息队列 - 从那时起,它将消息和runnables传递给该消息队列并在消息出来时执行它们队列中。

如果您想在不同的主题上运行Runnable,可以使用HandlerThread

相关文章:

Why use HandlerThread in Android

  

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

Handler有两个主要用途:

  1. 安排消息和runnables作为将来的某个点执行
  2. 将要在不同于自己的线程上执行的操作排入队列。
  3. 如果您仅使用MainThread,Handler将来可能会在某个时间点发送消息。如果您使用不同的线程,Handler对于线程之间的通信很有用。