Andorid中HandlerThread使用小记

遇到HandlerThread的问题,顺手复习一下HandlerThread用法:

package cn.areful.apistudy.handlerthread;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;
import android.widget.TextView;

import androidx.appcompat.app.AppCompatActivity;

import cn.areful.apistudy.R;

public class HandlerThreadActivity2 extends AppCompatActivity {
    private static final int MSG_UPDATE_INFO_THREAD = 0x0; //通知子线程执行耗时操作
    private static final int MSG_UPDATE_INFO_UI = 0x1000; //通知UI线程绘制

    private TextView mInfoText;
    private Handler mThreadHandler;
    private Handler mHandler;
    private boolean mIsUpdateInfo;

    public static void startActivity(Context context) {
        Intent intent = new Intent(context, HandlerThreadActivity2.class);
        if (!(context instanceof Activity)) intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
        context.startActivity(intent);
    }

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_handlerthread_sample);

        mInfoText = findViewById(R.id.infoText);
        //noinspection Convert2Lambda
        mHandler = new Handler(new Handler.Callback() {
            @Override
            public boolean handleMessage(Message msg) {
                //主线程刷新UI显示
                mInfoText.setText(String.valueOf(System.currentTimeMillis()));
                return false;
            }
        });

        //初始化HandlerThread
        HandlerThread handlerThread = new HandlerThread("BackgroundThread");
        handlerThread.start();
        mThreadHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                if (msg.what == MSG_UPDATE_INFO_THREAD) {
                    //子线程执行耗时操作
                    updateInfoInThread();
                    if (mIsUpdateInfo) {
                        //循环执行
                        mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO_THREAD);
                    }
                }
            }
        };
    }

    @Override
    protected void onResume() {
        super.onResume();
        mIsUpdateInfo = true;
        mThreadHandler.sendEmptyMessage(MSG_UPDATE_INFO_THREAD);
    }

    @Override
    protected void onPause() {
        super.onPause();
        mIsUpdateInfo = false;
        mThreadHandler.removeMessages(MSG_UPDATE_INFO_THREAD);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //移除主线程Handler的Messages,退出子线程
        mHandler.removeCallbacksAndMessages(null);
        mThreadHandler.getLooper().quit();
    }

    private void updateInfoInThread() {
        try {
            //模拟执行耗时操作
            Thread.sleep(1000);
            mHandler.sendEmptyMessage(MSG_UPDATE_INFO_UI);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

  

布局文件R.layout.activity_handlerthread_sample:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/infoText"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        tools:ignore="MissingConstraints" />

</androidx.constraintlayout.widget.ConstraintLayout>

  

原文地址:https://www.cnblogs.com/areful/p/12582479.html