1.HandlerThread是一个Thread,是Google为提高开发者效率封装的一个类。
与普通的Thread不同的是,它有一个成员属性 Looper,也就是说,我们的HandlerThread具有了Looper的功能。
public class HandlerThread extends Thread {
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
它在内部调用了looper的prepare和loop方法;
使用HandlerThread,我们就可以在初始化Handler的时候,将HandlerThread里的Looper传递给Handler。这样,主线程里Handler消息处理就会被转移到子线程里,这样一定程度上减少了主线程的压力。
2.使用
public class HandleActivity extends AppCompatActivity {
public static final int MSG_CODE = 0;
public static final int MSG_CODE2 = 1;
public static final String TAG = "HandleActivity";
private TextView tv;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
tv = findViewById(R.id.tv1);
HandlerThread handlerThread = new HandlerThread("ysl");
handlerThread.start();
Handler mHandler = new Handler(handlerThread.getLooper()){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
case 0:
Log.e("handlerThread子线程Name:", Thread.currentThread().getId()+"="+Thread.currentThread().getName());
break;
}
}
};
mHandler.sendEmptyMessage(0);
Log.e("handlerThread主线程Name:", Thread.currentThread().getId()+"="+Thread.currentThread().getName());
}
}
可以看到我们new了一个handlerthread对象,并接着调用了start方法;也就是thread的start方法,会执行里面的run方法;进而进行looper的一系列操作。
然后new了一个handler对象,并把handler thread的looper传了过去。那么这个handler就是使用了子线程的looper的handler,也就是可以处理接收并处理子线程的消息了。
2019-03-12 11:49:42.929 30147-30147/com.ysl.myandroidbaseserver E/handlerThread主线程Name:: 2=main
2019-03-12 11:49:42.929 30147-30182/com.ysl.myandroidbaseserver E/handlerThread子线程Name:: 3244=ysl
可以看到日志,发送消息在主线程,接收并处理消息在子线程。
- HandlerThread将Looper转移到子线程中处理,降低主线程的压力,不会阻塞主线程,界面显示会更流畅
- 子线程处理消息,因此可以处理一些比较耗时的单个任务。
- 由于使用消息队列的处理方式,故并发的多任务并不适用HandlerThread,会造成严重的阻塞