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

什么是 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
posted @ 2024-08-23 16:35  阿俊学JAVA  阅读(44)  评论(0编辑  收藏  举报