我想每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();
有效!但我有一些问题:
答案 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有两个主要用途:
如果您仅使用MainThread,Handler
将来可能会在某个时间点发送消息。如果您使用不同的线程,Handler
对于线程之间的通信很有用。