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>