HandlerThread见解之它不是更新ui的

前两天 ,看一个demo 发现了里面有使用HandlerThread。心生好奇,自己到网上看了 看资料,又翻了一下开发文档。写出来 抛砖引玉。

HandlerThread不能更新ui

我第一次看见handlerThread时候,因为,他带着Handler还以为是更新UI的,其实不是的。在验证的过程中,我还发现了 我以前的一个知识点错误(受一篇博文的引导。。。)。以后,任何东西 还是自己验证一下比较好。


首先,我先来说HandlerThread是啥。通俗的来说就是一个子线程具有了 looper和handler这样的机制 ,当这个子线程创建了handler的时候,别的线程可以通过handler来发送信息,并且可以在这个handler里面执行耗时的操作,除了不能更新ui,这样的机制,我们自己也可以通过

Looper.prepare();
Handler inner = new Handler() {
   
    @Override
    public void handleMessage(Message msg) {
   
        super.handleMessage(msg);
        System.out.println("内部handler 里面" + Thread.currentThread().getName() + "     ");
        Toast.makeText(MainActivity.this,"haahh",Toast.LENGTH_LONG).show();
        textView.setText(">>>>>>>>");
    }
};
inner.sendEmptyMessage(1);
Looper.loop();

不过,这样多费劲是吧。所以 谷歌给我们造了HandlerThread这个类 就是完成这样作用的。
如果,你运行以上代码会抛出异常:
android.view.ViewRootImpl$CalledFromWrongThreadException: Only the original thread that created a view hierarchy can touch its views.

这个就是只有主线程才能更新view。

看上面代码,我们在handleMessage(Message msg)这个方法里面 想更新 textView.setText(“>>>>>>>>”)。所以报错 了。这个首先说明了子线程联系的handler是不能更新线程的

不过,如果 我们把textView.setText()注释的话。

Looper.prepare();
Handler inner = new Handler() {
   
    @Override
    public void handleMessage(Message msg) {
   
        super.handleMessage(msg);
        System.out.println("内部handler 里面" + Thread.currentThread().getName() + "     ");
        Toast.makeText(MainActivity.this,"haahh",Toast.LENGTH_LONG).show();
        //textView.setText(">>>>>>>>");
    }
};
inner.sendEmptyMessage(1);
Looper.loop();

运行 你会发现toast弹出了!!!!

这是怎么回事了?首先,我们看toast的show方法在这里插入图片描述
看我划红线的地方。service服务。我们看

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值