Android之【ThreadHandler 】大全

😄作者简介: 小曾同学.com,一个致力于测试开发的博主⛽️,主要职责:测试开发、CI/CD
如果文章知识点有错误的地方,还请大家指正,让我们一起学习,一起进步。
😊 座右铭:不想当开发的测试,不是一个好测试✌️。
如果感觉博主的文章还不错的话,还请点赞、收藏哦!👍

在这里插入图片描述

前言

ThreadHandler 通常与 Android 开发中的 Handler 和 Thread 相关。在 Android 中,Handler 是一个用于线程间通信的工具,常常被用来处理线程间的消息传递和任务调度。以下是关于 ThreadHandler 的详细介绍,包括其用法、作用和与 Handler 相关的概念。

一 线程与消息队列

在 Android 中,主线程(也称为 UI
线程)负责处理用户界面更新和事件响应。如果一个耗时操作(如网络请求、文件读写等)直接运行在主线程中,会导致界面卡顿和
“应用无响应”(ANR)问题。

为了避免这些问题,通常需要将耗时任务放到子线程中运行。但是,子线程无法直接更新 UI 元素,因为 UI 更新必须在主线程中完成。这就引出了
Handler 的作用,它是线程间通信的桥梁,帮助子线程与主线程通信并更新 UI。

二 什么是Handler

Handler 是 Android 提供的工具类,用于在某个线程中处理消息或执行可运行任务(Runnable)。它与线程的 消息队列(MessageQueue)和 消息循环(Looper)紧密相关。
主要功能:

  • 向目标线程发送消息(Message)。
  • 向目标线程提交任务(Runnable)。
  • 处理消息或任务(通过重写 handleMessage() 方法)。

三 ThreadHandler 的基本用法

展示如何在子线程中执行耗时任务并将结果传递回主线程。

import android.os.Bundle;
import android.os.Handler;
import android.os.Looper;
import android.os.Message;
import androidx.appcompat.app.AppCompatActivity;

public class MainActivity extends AppCompatActivity {

    private Handler mainHandler; // 主线程 Handler
    private Thread workerThread; // 子线程

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

        // 初始化主线程 Handler
        mainHandler = new Handler(Looper.getMainLooper()) {
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                // 处理子线程传递的消息
                if (msg.what == 1) {
                    String result = (String) msg.obj;
                    // 更新 UI
                    System.out.println("主线程收到消息:" + result);
                }
            }
        };

        // 创建并启动子线程
        workerThread = new Thread(new Runnable() {
            @Override
            public void run() {
                // 模拟耗时操作
                try {
                    Thread.sleep(2000);
                    String result = "耗时操作完成";

                    // 将结果传回主线程
                    Message message = Message.obtain();
                    message.what = 1; // 消息类型
                    message.obj = result; // 消息内容
                    mainHandler.sendMessage(message); // 发送消息到主线程
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            }
        });
        workerThread.start();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 停止线程,避免内存泄漏
        if (workerThread != null && workerThread.isAlive()) {
            workerThread.interrupt();
        }
    }
}

四 相关解析

(1) 主线程 Handler

  • Handler 的构造器可以接受一个 Looper 对象,指定其绑定的消息队列。
  • Looper.getMainLooper() 返回 UI 线程的消息循环,因此这个 Handler 运行在主线程中。

(2) 子线程的耗时操作

  • 子线程执行耗时任务后,将结果封装成 Message 或 Runnable,通过 Handler 发送到主线程。

(3) 消息的处理

  • 子线程发送的消息由主线程的 Handler 通过其 handleMessage() 方法接收并处理。

五 完整线程与 Handler 的交互流程

(1)主线程初始化:

  • 在主线程中创建一个 Handler。
  • 绑定到主线程的消息循环,处理来自子线程的消息。

(2)子线程执行任务:

  • 子线程执行耗时任务。
  • 任务完成后,通过 Handler 向主线程发送消息(Message 或 Runnable)。

(3)主线程更新 UI:

  • 主线程通过 Handler 的 handleMessage() 方法接收消息,更新界面。

六 使用HandlerThread简化流程

HandlerThread 是 Android 提供的一个优化工具,用于简化线程与 Handler 的配合。它自带一个线程和消息循环,通常用于实现后台任务。

import android.os.Handler;
import android.os.HandlerThread;
import android.os.Message;

public class MainActivity extends AppCompatActivity {

    private HandlerThread handlerThread;
    private Handler backgroundHandler; // 后台线程 Handler
    private Handler mainHandler;      // 主线程 Handler

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        // 创建主线程 Handler
        mainHandler = new Handler(Looper.getMainLooper());

        // 创建 HandlerThread
        handlerThread = new HandlerThread("BackgroundThread");
        handlerThread.start();

        // 创建后台线程 Handler
        backgroundHandler = new Handler(handlerThread.getLooper()) {
            @Override
            public void handleMessage(Message msg) {
                // 处理消息(后台线程)
                if (msg.what == 1) {
                    String result = "后台任务完成";

                    // 将结果传回主线程
                    mainHandler.post(new Runnable() {
                        @Override
                        public void run() {
                            // 更新 UI
                            System.out.println("主线程收到结果:" + result);
                        }
                    });
                }
            }
        };

        // 发送任务到后台线程
        backgroundHandler.sendEmptyMessage(1);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        // 停止 HandlerThread
        handlerThread.quitSafely();
    }
}

八 注意事项

(1)内存泄漏:

  • 如果 Handler 持有对外部对象(如 Activity)的引用,而外部对象已经被销毁,可能会导致内存泄漏。
  • 使用静态 Handler 内部类或弱引用可以避免这一问题。

(2)线程安全:

  • 主线程和子线程之间的通信需要确保数据的一致性,尤其是访问共享资源时,需要使用同步机制。

(3)消息队列阻塞:

  • 如果 Handler 处理的任务太多或者太慢,可能会阻塞消息队列,导致响应速度变慢。

小结

ThreadHandler 是一个常见的设计模式,用于 Android 中处理多线程任务。
Handler 是核心工具,搭配 Message 或 Runnable 用于线程间通信。
HandlerThread 进一步简化了后台任务的管理。
合理使用 Handler,可以有效避免主线程阻塞和 ANR 问题,同时提高应用性能。

人生有两段路要走,一段是必须走的路,一段是想走的路。必须走的路先走好,才有机会走想走的路。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

小曾同学.com

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值