前言
在android开发过程中,我们经常用到Thread,Runnable,但是有一个特别的线程HandlerThread却是我很少用到的,那么今天就来讲讲HandlerThread的使用。
今天涉及的内容:
- HandlerThread相比Thread的优势
- HandlerThread实现事务队列探索
- 事务队列处理类TaskThread缺陷及适用场景
先上波效果图:
一. HandlerThread相比Thread的优势
HandlerThread的源码中有这么一行:
public class HandlerThread extends Thread {
//此处省略
//.....
}
即意味着HandlerThread其实也是一个Thread,但它又不仅仅是一个一般的Thread,其特别之处在于源码中的一段代码:
@Override
public void run() {
mTid = Process.myTid();
Looper.prepare();
synchronized (this) {
mLooper = Looper.myLooper();
notifyAll();
}
Process.setThreadPriority(mPriority);
onLooperPrepared();
Looper.loop();
mTid = -1;
}
正是这段代码给HandlerThread带来了不同之处,那么HandlerThread有什么特点呢:
- HandlerThread是一个维护有自己的一套Looper对列的Thread
- HandlerThread拥有自己的Handler
简单的来说就是HandlerThread是一个拥有自己维护队列haosh,可执行串行耗时操作的Thread - 需要注意的是 HandlerThread 的Handler不能直接操作UI
二.HandlerThread实现事务队列探索
2.1 HandlerThread的基本使用
在讲HandlerThread实现事务队列前,我们需要了解HandlerThread的基本用法
//新建HandlerThread
HandlerThread thread=new HandlerThread("k");
//HandlerThread执行
thread.start();
//获取HandlerThread的Handler并接收消息
final Handler handler=new Handler(thread.getLooper(), new Handler.Callback() {
@Override
public boolean handleMessage(Message msg) {
Log.i("pei","======msg pppp====="+msg.what);
return false;
}
});
//handler启动新线程
handler.post(new Runnable() {
@Override
public void run() {
//handler发送消息
handler.sendEmptyMessage(23);
}
});
2.2 事务队列TaskThread的基本使用
鉴于HandlerThread有一个自动维护的串行队列,我想到是否可以利用这点实现一个事务队列,于是自己发封装了一个事务队列的类TaskThread,其基本使用如下:
初始化:
mTaskThread=new TaskThread("a");
mTaskThread.start();
发送事件:
mTaskThread.addAffair(Object obj);
回调监听:
mTaskThread.setOnAffairListener(new TaskThread.OnAffairListener() {
@Override
public void doAffair(int taskId, Object result) {
final String kk=result.toString()+taskId;
Log.i("pei","=====kk==1==="+kk);
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText(kk);
}
});
}
});
销毁:
if(mTaskThread!=null) {
mTaskThread.quit();
}
2.3 TaskThread在MainActivity中使用代码样例
package com.webservicedemo;
import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
import android.widget.TextView;
public class MainActivity extends AppCompatActivity {
private Button mButton;
private TextView mTextView;
private TaskThread mTaskThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
initData();
setListener();
}
private void initView(){
mTextView = findViewById(R.id.textView);
mButton = findViewById(R.id.button);
}
private void initData(){
mTaskThread=new TaskThread("a");
mTaskThread.start();
}
private void setListener(){
mTaskThread.setOnAffairListener(new TaskThread.OnAffairListener() {
@Override
public void doAffair(int taskId, Object result) {
final String kk=result.toString()+taskId;
Log.i("pei","=====kk==1==="+kk);
runOnUiThread(new Runnable() {
@Override
public void run() {
mTextView.setText(kk);
}
});
}
});
mButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Log.i("pei","=====ggg=====");
mTaskThread.addAffair("kf");
}
});
}
@Override
protected void onDestroy(){
if(mTaskThread!=null) {
mTaskThread.quit();
}
super.onDestroy();
}
}
实现效果如下: