Runnable运行哪个线程?
我想每100毫秒更新一次UI。 在StackOverflow中搜索后,我发现了一个使用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
在MainThread上运行吗?
- 如果
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()
只是一个方法调用。
Handler
在Handler
运行的任何线程中随后执行此线程,除了重新安排自己之外基本上什么也没做。 很难相信这是任何事情的解决方案。
在您的示例中, 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有两个主要用途:
- 计划将来执行的消息和runnables
- 将要在不同于您自己的线程上执行的操作排入队列。
如果您仅使用MainThread,则Handler
在将来的某个时间点发送消息非常有用。 如果您使用不同的线程, Handler
对于线程之间的通信很有用。