判断handler.postDelayed(new Runnable)是否运行在主线程

项目中遇到一个问题:如果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()) 是没有重新生成新的线程的。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值