首页 > 其他分享 >Android开发 - Handler 类处理线程通信与任务调度解析

Android开发 - Handler 类处理线程通信与任务调度解析

时间:2024-08-21 11:39:08浏览次数:11  
标签:主线 Handler UI Looper 线程 任务调度 消息

什么是

  • Handler 类是处理线程间通信和任务调度的一个重要工具,用于在不同的线程之间传递消息执行任务

使用场景

  • 线程间通信:在子线程中执行任务后,更新主线程(UI 线程)的界面。

  • 任务调度:安排在将来某个时间点执行的任务。

基本工作原理

  • 消息队列:每个线程(包括主线程)都有一个消息队列。Handler 用来将消息任务(称为 "消息" 或 "可运行任务")放入这个队列

  • 消息处理Handler 通过一个 Looper 对象来处理消息队列中的消息。主线程有一个默认的 Looper,而子线程需要显式创建一个 Looper 对象

Handler 的使用

  • 创建 Handler 对象

    Handler handler = new Handler();
    
    • 这将创建一个与当前线程的 Looper 关联的 Handler。在主线程中,默认的 Looper 是主线程的 Looper,所以这个 Handler 会处理主线程的消息队列
  • 发送消息

    Message msg = handler.obtainMessage();
    msg.what = 1; // 设置消息类型
    handler.sendMessage(msg); // 发送消息
    
  • 发送可运行任务

    Runnable runnable = new Runnable() {
        @Override
        public void run() {
            // 这里写你的任务代码
        }
    };
    handler.post(runnable); // 立即执行
    handler.postDelayed(runnable, 1000); // 1秒后执行
    
  • 处理消息:需要实现 Handler 类handleMessage(Message msg) 方法。如果你不重写这个方法,Handler 会使用默认的处理逻辑

    Handler handler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
                case 1:
                    // 处理消息类型 1
                    break;
                case 2:
                    // 处理消息类型 2
                    break;
            }
        }
    };
    

线程与 Handler

  • 主线程:通常用于更新 UI。可以直接创建 Handler 对象处理 UI 相关的任务

  • 子线程:需要显式创建 Looper子线程不能直接更新 UI,所以通常会使用 Handler 将结果传递回主线程

// 在子线程中创建 Handler
Looper.prepare(); // 创建 Looper
Handler handler = new Handler(); // 创建 Handler
Looper.loop(); // 启动消息循环

常见应用场景

  • UI 更新:从子线程更新主线程的 UI 组件

  • 定时任务:安排定时执行的任务

  • 延迟任务:安排稍后执行的任务

代码示例

  • 假设在子线程中执行一些任务,并在任务完成后更新主线程的 UI

    // 主线程中的 Handler
    Handler mainHandler = new Handler(Looper.getMainLooper());
    
    new Thread(new Runnable() {
        @Override
        public void run() {
            // 在子线程中执行任务
            try {
                Thread.sleep(2000); // 模拟长时间任务
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
    
            // 更新 UI 需要在主线程中进行
            mainHandler.post(new Runnable() {
                @Override
                public void run() {
                    // 更新 UI
                    textView.setText("Task completed!");
                }
            });
        }
    }).start();
    

总结

  • Handler 用于线程间通信任务调度

  • 它通过消息队列Looper管理处理消息

  • 可以发送消息可运行任务,并自定义消息处理逻辑

  • 主线程子线程中都可以使用 Handler但子线程需要创建自己的 Looper

标签:主线,Handler,UI,Looper,线程,任务调度,消息
From: https://www.cnblogs.com/ajunjava/p/18371273

相关文章

  • 线程常用api
    线程常用apipthread_create该api用于创建一个新线程intpthread_create(pthread_t*thread,constpthread_attr_t*attr,void*(*start_routine)(void*),void*arg)pthread_t*thread:指向线程标识符的指针,用于存储新创建的线程的线程标识符constpthread_attr_t*attr:用来......
  • [JAVA]创建多线程的三种方式与区别
    继承Thread类创建线程实现Runnable接口创建线程Callable接口创建线程要学习创建线程,我们要通过代码来演示,这里我们可以通过实现以下参赛者跑步的场景来展开。模拟以下场景                              模拟10......
  • 线程组
    Java中使用ThreadGroup来表示线程组,它可以对一批线程进行分类管理,Java允许程序直接对线程组进行控制。默认情况下,所有的线程都属于主线程组。publicfinalThreadGroupgetThreadGroup()我们也可以给线程设置分组Thread(ThreadGroup group,Runnable target,String......
  • 在.NET应用中,使用Parallel类可以显著提高多线程环境下的执行效率
    在.NET应用中,使用Parallel类可以显著提高多线程环境下的执行效率,特别是当你需要并行执行多个不依赖彼此的任务时。Parallel类位于System.Threading.Tasks命名空间中,它提供了一系列静态方法,如Parallel.For、Parallel.ForEach和Parallel.Invoke,以支持并行循环和并行执行任务。1.......
  • 操作集合的工具类:Collections(以及将线程变安全的synchronized方法)
      静态成员方法:    publicstatic<T>voidsort(List<T>list)升序    publicstatic<T>intbinarySearch(List<?>list,Tkey)二分查找    publicstatic<T>Tmax(Collection<?>coll)找最大值    publicstaticvoidreve......
  • 线程(Thread)的使用方法和锁(同步代码块,lock锁)的问题
    多线程:    进程:      正在运行的程序,是系统进行资源分配和调用的独立单位。      每一个进程都有它自己的内存空间和系统资源。      理解:一个正在运行的软件    线程:      是进程中的单个顺序控制流,是......
  • tcp多个客户端访问服务端,运用多线程
    客户端packagecom.shujia.day20.tcpdemo3;importjava.io.InputStream;importjava.io.OutputStream;importjava.net.Socket;importjava.util.Scanner;/*1:建立客户端的Socket服务,并明确要连接的服务器。2:如果连接建立成功,就表明,已经建立了数据传输的通......
  • Java笔试面试题AI答之线程(2)
    文章目录7.如何确保N个线程可以访问N个资源同时又不导致死锁?1.资源排序与顺序访问2.资源分配策略3.避免占用并等待4.引入超时机制5.死锁检测与解决6.使用高级并发工具7.编程实践8.Java方法可以同时即是static又是synchronized的吗?9.什么是Java多线程同步?10......
  • Java线程池详解
    Java线程池详解线程池解释线程池采用了池化思想,能够有效的管理线程的生命周期,减少了每次获取资源的消耗,提高了资源的利用率。类似池化实现还有数据库连接池、HTTP连接池等好处减少了线程创建和销毁的开销提高了响应速度使得线程更加方便管理常见使用场景量大处理时间......
  • 【Redis】Redis线程与IO模型—(三)
    Redis线程与IO模型一、Redis单线程二、多路复用机制三、Redis6.0多线程特性四、IO多线程配置一、Redis单线程通常说Redis是单线程,主要是指Redis的网络IO和键值对读写是由一个线程来完成的,其他功能,比如持久化、异步删除、集群数据同步等,是由额外的线......