首页 > 其他分享 >Android开发 - Looper 类处理异步任务和消息解析

Android开发 - Looper 类处理异步任务和消息解析

时间:2024-08-23 16:37:50浏览次数:7  
标签:异步 处理 队列 Handler 线程 Looper Android 消息

什么是 Looper

  • Looper 是一个非常重要的概念,它与线程消息队列处理异步任务密切相关。是 Android 中用于管理线程的消息循环的类。它与线程中的 MessageQueue 结合工作,用于处理异步任务和消息

Looper 的主要概念

消息队列(MessageQueue)

  • 一个用于存放要处理的消息和任务的队列

  • 消息可以是不同线程之间传递的数据或者需要异步处理的任务

消息循环(Message Loop)

  • Looper 的核心功能。它不断地从消息队列中取出消息,并将这些消息分发给对应的处理器(Handler)进行处理

处理器(Handler)

  • Handler 是用来发送和处理消息的类。它通过 Looper 绑定到特定的线程上,并能够在该线程的消息队列中添加消息或任务

Looper 的工作流程

  1. 线程初始化每个线程都有自己的 Looper主线程(UI线程)应用启动时自动创建了一个 Looper
  2. 创建 Looper:如果你想在非主线程中使用消息循环,需要手动创建一个 Looper 实例。通常创建 Looper 的操作在子线程的 run() 方法中完成
  3. 启动消息循环:调用 Looper.loop() 启动消息循环,使线程不断地从消息队列中取出消息并处理
  4. 消息处理Handler 通过 Looper 绑定到特定线程的消息队列,能够在这个线程中处理消息或任务

使用示例

  • 假设有一个后台线程,需要在这个线程中处理异步任务。我们可以使用 LooperHandler 来实现

    1. 创建一个子线程并初始化 Looper

      public class MyThread extends Thread {
          @Override
          public void run() {
              // 创建 Looper 实例
              Looper.prepare(); // 准备 Looper
              Handler handler = new Handler(); // 创建 Handler,默认与当前线程的 Looper 关联
      
              // 启动消息循环
              Looper.loop();
      
              // 注意:在 Looper.loop() 之后的代码不会执行,除非调用 Looper.quit() 退出循环
          }
      }
      
    2. 主线程中发送消息到子线程

      public class MainActivity extends AppCompatActivity {
      
          private Handler workerHandler;
      
          @Override
          protected void onCreate(Bundle savedInstanceState) {
              super.onCreate(savedInstanceState);
              setContentView(R.layout.activity_main);
      
              // 启动子线程
              MyThread myThread = new MyThread();
              myThread.start();
      
              // 使用主线程中的 Handler 发送消息到子线程
              new Handler(Looper.getMainLooper()).post(() -> {
                  // 发送任务到子线程的消息队列
                  workerHandler = new Handler(myThread.getLooper());
                  workerHandler.post(() -> {
                      // 执行任务
                      Log.d("MyThread", "Task executed in worker thread");
                  });
              });
          }
      }
      

总结

  • Looper 是用于处理线程消息循环的核心组件。它管理线程的消息队列,并确保消息能够被正确地处理
  • Handler 用于发送和处理消息。它通常与 Looper 结合使用,使得任务可以异步处理而不会阻塞主线程
  • 主线程中,Android 自动创建了 Looper;而在子线程中,需要显式地创建并启动 Looper

标签:异步,处理,队列,Handler,线程,Looper,Android,消息
From: https://www.cnblogs.com/ajunjava/p/18376364

相关文章

  • Android开发 - BluetoothGattCallback 类处理蓝牙 (BLE) 设备的连接和通信解析
    BluetoothGattCallback是什么BluetoothGattCallback是一个抽象类,用于接收BLE设备的各种回调事件。这些事件包括连接状态的变化、服务的发现、特性的读取和写入等BluetoothGattCallback的主要方法onConnectionStateChange(BluetoothGattgatt,intstatus,intnewStat......
  • Android T adout replace bootanimation
    idea_1:useotareplacebootanimation.zipidea_2:创建一个新的分区,(用于存放bootanimation.zip)可以让上层读写.idea_3:sucp前提条件:userdebug版本,默认关闭selLinux,可root//df查看设备分区情况,有些分区系统是不让去写的adbshellc4_t:/$dfFilesystem......
  • Android 关于设备定屏/黑屏/冻屏/ANR那些事
    定屏/黑屏常见问题我的理解是冻屏和定屏是一个意思.冻屏:目的就是防止执行默写操作的过程出现黑屏,冻屏的过程只是不接收输入和不执行动画,并且会截取屏幕进行显示.A:系统问题(底层/framework层)A_1:system_server_watchdog:现象多为卡顿/黑屏A_2:WMS(WindowManagerService)......
  • Android Qcom USB Driver学习(八)
    因为要看usbcharging的问题,所以需要补充一下battery的相关知识,算是入门吧BATSCH(1)VBATT_VSNS_P(2)BAT_THERM(3)I2C_SDA(4)I2C_SCL(5)VBATT_VSNS_Msbl1_hw_pre_ddr_init:(1)pm_device_init(2)pm_driver_init(3)pm_sbl_chg_init(1)pm_device_init没有研究过,也是......
  • Android Qcom USB Driver学习(七)
    最近遇到了USB插拔后,系统重启的问题,抓取串口log发现如下问题,log中查看trace分析就是空指针造成的panicUnabletohandlekernelreadfromunreadablememoryatvirtualaddress0000000000000000Memabortinfo:ESR=0x96000005Exceptionclass=DABT(currentEL),......
  • Android Qcom USB Driver学习(六)
    眼图基础知识与详解10分钟教会你看眼图USB2.0HUB眼图调试经验总结一篇文章教你如何全面了解眼图测试!预加重与去加重对眼图的影响关于USB通信阻抗匹配的问题硬件调试——眼图几个经典案例眼图常见问题分析包含双眼皮的情况PHYTunningdevicetree:qusb_phy0:qusb@1613......
  • 【Android笔记】Android APK编译打包流程
    前言本文将介绍Android从一个项目打包成APK的过程,其中涉及AndroidJava和Kotlin文件、资源文件、清单文件、依赖jar包和so库等在打包过程中处理。步骤总体的打包流程如下图,下面就介绍下详细的打包步骤。1、将aidl文件编译成java文件在构建过程中,Gradle会调用AIDL编......
  • 记一次vue数据异步刷新引发的bug
    问题背景在开发过程中,为了threejs对象在watch监听中能够被顺利取到,我加了一个信号量,在初始化对象后,通过threejs对象状态和表单状态来重新渲染画面。然而,我把threejs对象从null设置为正常的对象时,页面居然卡死了。在实际的代码中,用到对象的情况只有wacth里面监听到信号量为true时......
  • 消息队列作用(解耦、异步、削峰)
    原文:消息队列作用(解耦、异步、削峰)图详解一、消息队列简介简单来说,“消息队列”是在消息的传输过程中保存消息的容器。MQ全称为MessageQueue,消息队列(MQ)是一种应用程序对应用程序的通信方法。应用程序通过读写出入队列的消息(针对应用程序的数据)来通信。消息传递指的是程......
  • Android逆向(七) 解密COCOS游戏lua脚本-第1篇
    目录一、系统环境二、详细分析前言:1.lua脚本是什么?2.为什么游戏开发要用lua脚本?正文:获取Lua脚本的几种方法:1.直接在assets目录提取2.在luaL_loadbuffer函数处获取3.在底层的reader函数处获取1.静态分析2.动态分析一、系统环境OS:Windows_NTx6410.0......