在 Android 开发中,我们经常会涉及到主线程和子线程之间的通信。而在某些情况下,我们不仅需要从主线程发送消息到子线程,还希望子线程能够接收并处理这些消息。在本篇博客中,我们将介绍如何通过子线程自带的 Looper 实现这个功能。
1. Looper 和 Handler
Looper 是 Android 系统中的一个类,它负责管理线程的消息循环。每个线程只能拥有一个 Looper,而主线程已经在应用启动时自动创建了 Looper 对象。
Handler 是与 Looper 结合使用的类,它负责发送和处理消息。我们可以通过 Handler 的 sendMessage()
方法在主线程中发送消息。
2. 子线程的 Looper 和 Handler
默认情况下,子线程是没有自己的 Looper 的。因此,如果我们要在子线程中接收并处理主线程发送的消息,就需要手动为子线程创建一个 Looper。接下来,我们将介绍具体的实现方法。
- 在子线程的
run()
方法中,调用Looper.prepare()
来为子线程创建 Looper。 - 在
Looper.prepare()
后调用Looper.loop()
来开启消息循环。这个方法会一直阻塞在这里,直到使用Looper.quit()
结束消息循环。 - 在子线程的
run()
方法中创建 Handler 对象,用于接收和处理消息。
下面是一个示例代码,展示了如何为子线程创建 Looper 并处理主线程发送的消息:
public class MyThread extends Thread {
public Handler mHandler;
@Override
public void run() {
// 1. 创建 Looper
Looper.prepare();
// 2. 开始消息循环
Looper.loop();
// 3. 创建 Handler
mHandler = new Handler() {
@Override
public void handleMessage(Message msg) {
// 在这里处理消息
}
};
}
}
3. 主线程给子线程发送消息
在主线程中,我们可以通过获取子线程的 Handler,并使用其 sendMessage()
方法发送消息。下面是一个示例代码:
public class MainActivity extends AppCompatActivity {
private MyThread mThread;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 创建子线程并启动
mThread = new MyThread();
mThread.start();
// 发送消息到子线程
Message msg = mThread.mHandler.obtainMessage();
// 设置消息的参数
Bundle data = new Bundle();
data.putString("key", "Hello, SubThread!");
msg.setData(data);
// 发送消息
mThread.mHandler.sendMessage(msg);
}
}
4. 总结
通过子线程自带的 Looper 和 Handler,我们可以实现主线程和子线程之间的消息通信。子线程可以通过 Looper 消息循环来接收并处理主线程发送的消息。这种方式极大地简化了在 Android 开发中的线程通信问题。
希望本篇博客能够对你理解 Android 主线程给子线程发送消息有所帮助。如果有任何疑问或建议,请随时留言讨论。
本文来自极简博客,作者:天空之翼,转载请注明原文链接:Android 主线程给子线程发送消息——子线程有自己的 Looper