相信很多同学都听说并使用过HandlerThread、Thread、Handler,但具体对这三种的用法和区别你真有认真总结过吗?
本文帮你区别并了解三者的基本用法。
Thread基本用法
Thread类实现了Runnable接口,必须重写run()方法;
//匿名内部类形式
new Thread(new Runnable() {
@Override
public void run() {
// TODO Auto-generated method stub
}
});
或者
class myThread implements Runnable {
@Override
public void run() {
// TODO Auto-generated method stub
}
}
启动一个线程,用start()方法;
HandlerThread基本用法
看源码开头的方法注释,我们可以很清楚的了解这个类的用途:
/*
Handy class for starting a new thread that has a looper.
The looper can then be used to create handler classes.
Note that start() must still be called.
*/
翻译过来就是:
使用HandlerThread可以方便的开启一个线程,并且这个线程已经绑定了一个looper了。这个looper可以用来new一个handler类。注意在此之前,要调用start()方法。
示例代码如下:
HandlerThread thread1 = new HandlerThread("test1");
thread1.start();
看到这里很多同学可能会产生一个疑问,为什么这个线程已经绑定了一个Looper了呢?还要在此之前调用start()方法?
答案就是:提前调用start()方法就是为了为线程绑定Looper的。
我们知道,start()方法可以开启一个线程,调用线程的run()方法。而HandlerThread的run()方法是这样的:
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();// HandlerThread在start()的时候执行run()方法,而Looper就是在这里被创建的
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
看到没,run()方法里面调用Looper.prepare()来为线程绑定一个Looper。 Looper.loop()开启消息循环。相当于把