HandlerThread简介:

我们知道,Thread线程是一次性消费品。当Thread线程执行完一个耗时的任务之后,线程就会被自动销毁。如果此时我们又有一个耗时任务需要执行,我们不得不重新创建线程去执行该耗时任务。然而,这样就存在一个性能问题:多次创建和销毁线程是很耗系统资源的。为了解这种问题,我们可以自己构建一个循环线程Looper Thread。当有耗时任务投放到该循环线程中时,线程执行耗时任务,执行完之后循环线程处于等待状态,直到下一个新的耗时任务被投放进来。这样一来就避免了多次创建Thread线程导致的性能问题了。也许你可以自己去构建一个循环线程,但我可以告诉你一个好消息,Aandroid SDK中其实已经有一个循环线程的框架了。此时你只需要掌握其怎么使用的就ok啦!当然就是我们今天的主角HandlerThread啦!接下来请HandlerThread上场,鼓掌~~

HandlerThread的父类是Thread,因此HandlerThread其实是一个线程,只不过其内部帮你实现了一个Looper的循环而已。那么我们先来了解一下Handler是怎么使用的吧!

HandlerThread使用步骤:

1. 创建实例对象

```java

HandlerThread handlerThread = new HandlerThread(“handlerThread”);

```

以上参数可以任意字符串,参数的作用主要是标记当前线程的名字。

2. 启动HandlerThread线程

```java

handlerThread.start();

```

到此,我们就构建完一个循环线程了。那么你可能会怀疑,那我怎么将一个耗时的异步任务投放到HandlerThread线程中去执行呢?当然是有办法的,接下来看第三部。

3. 构建循环消息处理机制

```java

Handler subHandler = new Handler(handlerThread.getLooper(), new Handler.Callback() {

@Override

public boolean handleMessage(Message msg) {

//实现自己的消息处理

return true;

}

});

```

以下是重构后的内容:

```java

package com.example.handlerthread;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.HandlerThread;

import android.os.Message;

import android.view.View;

public class MainActivity extends Activity {

private Handler mHandler;

private HandlerThread mHandlerThread;

@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_main);

mHandlerThread = new HandlerThread("MyHandlerThread");

mHandlerThread.start();

mHandler = new MyHandler(mHandlerThread.getLooper());

}

public void sendMessage(View view) {

Message message = Message.obtain();

message.what = 1; // 这里可以自定义消息类型,用于区分不同的耗时任务

mHandler.sendMessage(message); // 将消息发送到线程中执行

}

private static class MyHandler extends Handler {

private final HandlerThread mThread;

MyHandler(Looper looper) {

super(looper);

mThread = new HandlerThread("MyHandlerThread");

mThread.start();

}

@Override

public void handleMessage(Message msg) {

if (msg.what == 1) { // 这里可以自定义消息类型,用于区分不同的耗时任务

// 在工作线程中执行耗时任务,例如下载文件、网络请求等操作

// ...

} else {

super.handleMessage(msg);

}

}

}

}

```