zoukankan      html  css  js  c++  java
  • 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>
    

      

  • 相关阅读:
    自定义行操作事件——DataGrid系列
    分页样式——DataGrid系列
    勾选批量操作——DataGrid系列
    快速排序的基本实现
    2021/06--09学习情况一些总结和反思
    IntegerCache的一些联想
    Hibernate, Jpa, Spring Data Jpa的关系与区别
    Springboot+Hibernate+Transactional中save提交引发的db异常无法捕获
    一个涉及多系统多步骤的业务需求设计与思考
    Use SQL to query dataverse
  • 原文地址:https://www.cnblogs.com/areful/p/12582479.html
Copyright © 2011-2022 走看看