项目中遇到一个问题:如果handler对象是在主线程中获得的,这时若在子线程中调用handler.postDelayed(new Runnable()),Runnable中的run()逻辑就不会被执行。后面我就通过eventbus通知到主线程,让主线程来调用handler.postDelayed(new Runnable())才生效
那么如何判断handler.postDelayed(new Runnable())是否运行在主线程中?
答: new Runnable() 依附于创建Handler的线程,即若创建Handler的线程是主线程,则runnable也就需要在主线程执行;若创建Handler的线程是子线程,则runnable也就需要在子线程执行。
在UI线程(即主线程)中打印线程ID来验证一下:
System.out.println("主线程为== " + Thread.currentThread().getId());
UI线程中调用new Handler().postDelayed中打印运行线程的ID:
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
System.out.println("Handler 线程为 ==" + Thread.currentThread().getId());
}
}, 5000);
最后打印如下:
主线程为== 1
Handler 线程为 == 1
可以看出来,它们两个程序都是运行在主线程中的。
谷歌的官方解释是:
The runnable will be run on the thread to which this handler is attached.
这是说,该开启的runnable会在这个handler所依附线程中运行,而这个handler是在UI线程(即主线程)中创建的,所以 runnable自然地依附在主线程中了。
postDelayed(new Runnable()) 是没有重新生成新的线程的。