HandlerThread:使用方式

1、定义
  1. 异步线程类。
2、作用
  1. 继承 Thread + 封装 Handler,方便顺序执行耗时任务。
3、具体使用
  1. 创建 HandlerThread 管理耗时任务执行。
  2. 创建 workHandler 执行具体耗时任务,绑定 HandlerThread 的 Looper 。
  3. 创建 uiHandler 执行具体 UI 更新。
  4. 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、注意点
  1. Handler 内存泄漏。
  2. 连续发送消息,将顺序执行任务,HandlerThread 只开启一个线程,内部维护一个 Handler。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要终止 `HandlerThread`,可以通过以下步骤来实现: 1. 创建一个继承自 `HandlerThread` 的自定义线程类,并重写 `run()` 方法。在 `run()` 方法中,使用一个循环来执行线程的操作。 ```java public class MyHandlerThread extends HandlerThread { private Handler mHandler; public MyHandlerThread(String name) { super(name); } @Override public void run() { // 创建 Handler mHandler = new Handler(getLooper()); // 执行线程的操作 while (!Thread.currentThread().isInterrupted()) { // 线程运行逻辑 } } // 通过 Handler 发送消息来终止线程 public void stopThread() { mHandler.getLooper().quitSafely(); } } ``` 2. 在主线程中创建自定义的 `MyHandlerThread` 对象,并启动线程。 ```java MyHandlerThread myHandlerThread = new MyHandlerThread("MyHandlerThread"); myHandlerThread.start(); ``` 3. 当需要终止线程时,调用 `stopThread()` 方法来发送消息给 `HandlerThread`,从而终止线程的执行。 ```java myHandlerThread.stopThread(); ``` 通过调用 `stopThread()` 方法,会发送一个消息给 `HandlerThread` 的消息队列,使得 `HandlerThread` 在下一次循环时退出,并释放相关资源。这样可以优雅地终止 `HandlerThread` 的执行。 需要注意的是,在 `run()` 方法中的循环体内,使用了 `!Thread.currentThread().isInterrupted()` 来判断线程是否被中断。当调用 `stopThread()` 方法时,会中断 `HandlerThread` 的 `run()` 方法,从而使得循环条件不满足,退出线程的执行。 这种方式可以通过发送消息来终止 `HandlerThread`,同时还可以在 `run()` 方法中进行其他清理操作,以确保线程的终止和资源的释放。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值