Runnable 运行 在哪个线程上运行?
Which thread does Runnable run on?
我想每 100 毫秒更新一次 UI。在 Whosebug 中搜索后,我找到了使用 Runnable
和 Handler
的解决方案,例如
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
//update UI here
handler.postDelayed(this, 100);
}
};
runnable.run();
有效!但我有一些问题:
- 这个
Runnable
运行 在哪个线程上? MainThread 还是另一个线程?这是关于 postDelay
的文档
Handler
附加在 MainThread 上,Runnable
运行ning 也在 MainThread 上吗?
- 如果
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()
只是一个方法调用。
此线程的 后续 执行,由 Handler
在 Handler
运行的任何线程中执行,除了重新安排自己之外,基本上什么都不做。很难相信这是解决任何问题的方法。
在您的示例中,UI 线程上的 Runnable
运行。
如果您希望您的 Handler
及其所有 Runnable
到 运行 在不同的线程中,您必须为其分配一个新的 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 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
处理程序有两个主要用途:
- 安排消息并运行能够在未来的某个时间点执行
- 将要在不同于您自己的线程上执行的操作排队。
如果您只使用 MainThread,Handler
可用于在将来的某个时间点发送消息。如果您使用不同的线程,Handler
对于线程之间的通信很有用。
我想每 100 毫秒更新一次 UI。在 Whosebug 中搜索后,我找到了使用 Runnable
和 Handler
的解决方案,例如
final Handler handler = new Handler();
Runnable runnable = new Runnable() {
@Override
public void run() {
//update UI here
handler.postDelayed(this, 100);
}
};
runnable.run();
有效!但我有一些问题:
- 这个
Runnable
运行 在哪个线程上? MainThread 还是另一个线程?这是关于postDelay
的文档
Handler
附加在 MainThread 上,Runnable
运行ning 也在 MainThread 上吗?
- 如果
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()
只是一个方法调用。
此线程的 后续 执行,由 Handler
在 Handler
运行的任何线程中执行,除了重新安排自己之外,基本上什么都不做。很难相信这是解决任何问题的方法。
在您的示例中,UI 线程上的 Runnable
运行。
如果您希望您的 Handler
及其所有 Runnable
到 运行 在不同的线程中,您必须为其分配一个新的 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 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
处理程序有两个主要用途:
- 安排消息并运行能够在未来的某个时间点执行
- 将要在不同于您自己的线程上执行的操作排队。
如果您只使用 MainThread,Handler
可用于在将来的某个时间点发送消息。如果您使用不同的线程,Handler
对于线程之间的通信很有用。