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的文档 在此处输入图像描述

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

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

Runnable运行在哪个线程上?

 Runnable runnable = new Runnable() { @Override public void run() { //update UI here handler.postDelayed(this, 100); } }; runnable.run() 

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

HandlerHandler运行的任何线程中随后执行此线程,除了重新安排自己之外基本上什么也没做。 很难相信这是任何事情的解决方案。

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

如果你想让你的Handler和它的所有Runnable在不同的Thread中运行,你将不得不为它分配一个新的HandlerThread的Looper

 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附加了MainThread,Runnable在MainThread上运行吗?

来自Handler文档:

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

如果要在不同的线程上运行Runnable ,可以使用HandlerThread 。

相关文章:

为什么在Android中使用HandlerThread

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

Handler有两个主要用途:

  1. 计划将来执行的消息和runnables
  2. 将要在不同于您自己的线程上执行的操作排入队列。

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