Android 主线程给子线程发送消息——子线程有自己的 Looper

天空之翼 2024-05-28 ⋅ 33 阅读

在 Android 开发中,我们经常会涉及到主线程和子线程之间的通信。而在某些情况下,我们不仅需要从主线程发送消息到子线程,还希望子线程能够接收并处理这些消息。在本篇博客中,我们将介绍如何通过子线程自带的 Looper 实现这个功能。

1. Looper 和 Handler

Looper 是 Android 系统中的一个类,它负责管理线程的消息循环。每个线程只能拥有一个 Looper,而主线程已经在应用启动时自动创建了 Looper 对象。

Handler 是与 Looper 结合使用的类,它负责发送和处理消息。我们可以通过 Handler 的 sendMessage() 方法在主线程中发送消息。

2. 子线程的 Looper 和 Handler

默认情况下,子线程是没有自己的 Looper 的。因此,如果我们要在子线程中接收并处理主线程发送的消息,就需要手动为子线程创建一个 Looper。接下来,我们将介绍具体的实现方法。

  1. 在子线程的 run() 方法中,调用 Looper.prepare() 来为子线程创建 Looper。
  2. Looper.prepare() 后调用 Looper.loop() 来开启消息循环。这个方法会一直阻塞在这里,直到使用 Looper.quit() 结束消息循环。
  3. 在子线程的 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 主线程给子线程发送消息有所帮助。如果有任何疑问或建议,请随时留言讨论。


全部评论: 0

    我有话说: