Android开发 - Looper 类处理异步任务和消息解析
什么是 Looper
- Looper 是一个非常重要的概念,它与线程、消息队列和处理异步任务密切相关。是 Android 中用于管理线程的消息循环的类。它与线程中的 MessageQueue 结合工作,用于处理异步任务和消息
Looper 的主要概念
消息队列(MessageQueue)
-
一个用于存放要处理的消息和任务的队列
-
消息可以是不同线程之间传递的数据或者需要异步处理的任务
消息循环(Message Loop)
- Looper 的核心功能。它不断地从消息队列中取出消息,并将这些消息分发给对应的处理器(Handler)进行处理
处理器(Handler)
- Handler 是用来发送和处理消息的类。它通过 Looper 绑定到特定的线程上,并能够在该线程的消息队列中添加消息或任务
Looper 的工作流程
- 线程初始化:每个线程都有自己的 Looper。主线程(UI线程)在应用启动时自动创建了一个 Looper
- 创建 Looper:如果你想在非主线程中使用消息循环,需要手动创建一个 Looper 实例。通常创建 Looper 的操作在子线程的
run()
方法中完成 - 启动消息循环:调用
Looper.loop()
启动消息循环,使线程不断地从消息队列中取出消息并处理 - 消息处理:Handler 通过 Looper 绑定到特定线程的消息队列,能够在这个线程中处理消息或任务
使用示例
-
假设有一个后台线程,需要在这个线程中处理异步任务。我们可以使用 Looper 和 Handler 来实现
-
创建一个子线程并初始化 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() 退出循环 } }
-
在主线程中发送消息到子线程
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