前两天 ,看一个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服务。我们看