界面介绍
主界面只有2个textview和3个button(默认空间没删),按钮继承的HandlerThread就是HandlerThread的使用,第二个按钮启动下一个Activity,第三个按钮显示为何需要HandlerThread(挺重要的)。
正如所看到的样子,从start–>looper–>quit依次点击(别乱了,没有错误处理和判断)。
HandlerThread的用法
使用
首先继承了HandlerThread,并实现了 Handler.Callback的借口
private class MyHandlerThread extends HandlerThread implements Handler.Callback {
public MyHandlerThread(String name) {
super(name);
}
@Override
public boolean handleMessage(Message msg) {
System.out.println("handleMessage CurrentThread=" + Thread.currentThread().getName());
handlerUi.sendEmptyMessage(i);
i++;
return false;
}
}
初始化该handlerThread并启动
handlerThread = new MyHandlerThread("myHandler");
handlerThread.start();
Ui线程获取能给HandlerThread发消息的Handler
handler = new Handler(handlerThread.getLooper(), handlerThread);
那HandlerThread如何给Ui线程发消息呢?
还是在MyHandlerThread里面
handlerUi.sendEmptyMessage(i);
soga,通信完成。。
为什么要继承HandlerThread呢
就像我们为什么要开启线程呢,肯定有事住线程不能做(主线程不能做的事好多)。
HandlerThread本身就是一个线程,只是这个线程内部有一个looper而这个looper有一个消息队列MessageQue,它通过不断的用looper去检查MessageQue然后取出消息然后处理,UI主线程本身也是这么干的,我们使用HandlerThread的目的就是借鉴这种线程通信模式
handlerThread的作用(易误解)
以前看别人这么写代码的时候就误解过,那时候关于回调(callback)还不是很会用,关于回调,在java里面使用的次数太多了,面向接口编程很重要
如果不看参数很容易以为
handler = new Handler(handlerThread.getLooper(), handlerThread);
里面的第二个参数也需要handlerThread似的,这也是我以前所困惑的地方,其实他们的参数是 Handler(Looper looper, Callback callback),所以许多地方这样写是为了方便,也就是只要是一个实现了Handler.Callback的对象都行。
如何使用HandlerThread
好了,东西都有了,现在我们就可以使用HandlerThread了
点击按钮,继承的HandlerThread然后就可以实现通过UI线程——>子线程——>UI线程发送消息了
仅仅这样吗?
不,我们自己的线程怎么运行呢?
现在可以使用了
class MyRunnable implements Runnable{
@Override
public void run() {
handlerUi.sendEmptyMessage(i);
i=i+2;
handler.postDelayed(MyRunnable.this,1000);
}
}
MyRunnable runnable=new MyRunnable();
handler.postDelayed(runnable,500);
通过HandlerThread的参数(Looper)构造的handler就是我们的工具,比如上面的代码,我们只需要
handler.postDelayed(runnable,500);
就把一个后台线程给运行了,该线程具有通过ui线程的handler更新ui的功能,此时我们并没有使用MyHandlerThread实现的Callback,那个callback是用来接受来自ui线程的消息,通过UI线程的
handler.sendEmptyMessage(1);
去调用Callback
下一节讲解HandlerThread
源码在下一节结尾放出