返回

Android编程实践-Handler从MessageQueue中如何取出Message

Android

Handler是一个Android中用于线程间通信的类,它可以将消息从一个线程发送到另一个线程。Handler通过一个MessageQueue来存储消息,当有消息到来时,Handler会从MessageQueue中取出消息并执行它。

Handler是如何从MessageQueue中取出消息的呢?这主要涉及到Looper和dispatchMessage方法。Looper是一个循环,它不断地从MessageQueue中取出消息并执行它们。当一个线程调用Looper.loop()方法时,Looper就会启动并开始循环。

当一个Handler被创建时,它会创建一个Looper,并将其绑定到当前线程。当有消息到来时,Looper会将消息放入MessageQueue中。Handler可以通过调用dispatchMessage方法从MessageQueue中取出消息并执行它们。

dispatchMessage方法是Handler类中定义的一个方法,它用于从MessageQueue中取出消息并执行它们。dispatchMessage方法首先会检查MessageQueue中是否有消息,如果有,则会取出消息并执行它。如果没有,则会等待一段时间,然后再次检查MessageQueue中是否有消息。

Handler的这种工作机制使得它可以非常高效地处理消息。当有消息到来时,Handler会立即将其取出并执行,而不需要等待其他线程。这使得Handler非常适合用于处理UI更新和网络请求等需要及时处理的任务。

以下是一些有关Handler从MessageQueue中取出消息的示例代码:

public class MyHandler extends Handler {

    public MyHandler() {
        super();
    }

    @Override
    public void handleMessage(Message msg) {
        // 处理消息
    }
}

public class MyThread extends Thread {

    private Handler handler;

    public MyThread(Handler handler) {
        this.handler = handler;
    }

    @Override
    public void run() {
        // 发送消息
        Message msg = new Message();
        handler.sendMessage(msg);
    }
}

public class MainActivity extends Activity {

    private Handler handler;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        handler = new MyHandler();

        // 创建并启动线程
        MyThread thread = new MyThread(handler);
        thread.start();
    }
}

在上面的示例代码中,MyHandler类继承了Handler类,并重写了handleMessage方法。当有消息到来时,handleMessage方法会被调用,并执行处理消息的逻辑。MyThread类继承了Thread类,并重写了run方法。当线程启动后,run方法会被调用,并在其中发送消息。MainActivity类继承了Activity类,并在onCreate方法中创建了一个Handler对象和一个线程对象。当Activity创建时,线程对象会被启动,并开始发送消息。当消息到来时,Handler对象会处理消息。