1、定义
- 异步线程类。
2、作用
- 继承 Thread + 封装 Handler,方便顺序执行耗时任务。
3、具体使用
- 创建 HandlerThread 管理耗时任务执行。
- 创建 workHandler 执行具体耗时任务,绑定 HandlerThread 的 Looper 。
- 创建 uiHandler 执行具体 UI 更新。
- workHandler 发送消息通知执行具体耗时任务。
public class HandlerThreadActivity extends AppCompatActivity implements View.OnClickListener {
private HandlerThread handlerThread;
private Handler workHandler, uiHandler;
private AppCompatButton dataBtn;
private int count = 0;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_handlerthread);
findViewById(R.id.delay1s).setOnClickListener(this);
findViewById(R.id.delay2s).setOnClickListener(this);
findViewById(R.id.quit).setOnClickListener(this);
dataBtn = findViewById(R.id.dataBtn);
uiHandler = new Handler();
handlerThread = new HandlerThread("ThreadName");
handlerThread.start();
workHandler = new Handler(handlerThread.getLooper()) {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case 1:
try {
count += 1;
Thread.sleep(1000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
uiHandler.post(new Runnable() {
@Override
public void run() {
dataBtn.setText(String.format(Locale.getDefault(), "延迟 %d 秒", count));
}
});
break;
case 2:
try {
count += 2;
Thread.sleep(2000L);
} catch (InterruptedException e) {
e.printStackTrace();
}
uiHandler.post(new Runnable() {
@Override
public void run() {
dataBtn.setText(String.format(Locale.getDefault(), "延迟 %d 秒", count));
}
});
break;
default:
break;
}
}
};
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.delay1s:
Message message1 = Message.obtain();
message1.what = 1;
workHandler.sendMessage(message1);
break;
case R.id.delay2s:
Message message2 = Message.obtain();
message2.what = 2;
workHandler.sendMessage(message2);
break;
case R.id.quit:
dataBtn.setText("quitWork");
handlerThread.quit();
default:
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
handlerThread.quit();
}
}
<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.LinearLayoutCompat xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<android.support.v7.widget.AppCompatButton
android:id="@+id/delay1s"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="延迟 1 秒"
android:textAllCaps="false" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/delay2s"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="延迟 2 秒"
android:textAllCaps="false" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/quit"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="quitWork"
android:textAllCaps="false" />
<android.support.v7.widget.AppCompatButton
android:id="@+id/dataBtn"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="初始化"
android:textAllCaps="false" />
</android.support.v7.widget.LinearLayoutCompat>
3、注意点
- Handler 内存泄漏。
- 连续发送消息,将顺序执行任务,HandlerThread 只开启一个线程,内部维护一个 Handler。