【问题标题】:How does Android/DalvikVM process Handlers?Android/DalvikVM 如何处理 Handlers?
【发布时间】:2011-01-10 17:38:13
【问题描述】:

我想知道如何在 Android/DalvikVM 中处理处理程序。我正在为 Android 编写一个应用程序,在一个类中我有一个 Handler 方法,它接收来自另一个类的消息。 Handler 方法会充当 Thread 并与同一类中的 run() 方法异步,还是会等到 run() 方法中的一行代码完成(某种原子操作)?还是别的什么?

我想知道,因为我想在Handler方法中将消息添加到队列中,并在run()方法中处理和删除它们(生产者-消费者)。

我的代码结构:

public class Parser implements Runnable {
    public void run() {
            while(true) {
            // Remove a byte from the ring buffer and parse it
            byte b = Ringbuffer_read();
            // Parse
        try {
                Thread.sleep(40);
            } catch (InterruptedException e) {}
           }
    }

    private final Handler mHandler = new Handler() {
        @Override
        public void handleMessage(Message msg) {
            switch (msg.what) {
            case MESSAGE_READ:
                // Store all the received bytes in the ring buffer
                for (int i = 0; i < msg.arg1; i++) {
                    Ringbuffer_store(((byte[]) msg.obj)[i]);
                }
                break;
            }
        }
    };
}

处理程序中的代码何时运行?它会在任何时候中断 run() 方法中的代码吗?我是否必须在 run() 和处理程序方法中的代码周围有一些同步或信号量或其他东西,以免损坏缓冲区?

【问题讨论】:

    标签: android handler producer consumer


    【解决方案1】:

    Android Handler 将自己与创建它的任何线程相关联(假设该线程已经有一个 looper)。默认情况下,Android 回调在名为“main”的线程上运行,该线程也称为 ui 线程。无论从哪个线程调用post 方法,handleMessage 方法都将从创建 Handler 的线程(通常是“主”线程)中调用。因为handleMessage方法总是在同一个线程中调用,所以一次只会处理一条消息。

    如果您的计划是只有一个消费者,那么 Handler 是一个不错的选择。您不需要从您的消费者(处理程序)中删除消息,而是它们将简单地到达handleMessage 进行处理。如果您想在“主”线程上进行处理,那么您只需创建一个新的处理程序,如果您想在后台进行处理以避免 ANR,您可能需要使用HandlerThread。这是一个在它自己的后台线程上运行的 Handler 的示例:

    HandlerThread handlerThread = new HandlerThread("Consumer");
    handlerThread.start();
    Handler consumer = new Handler(handlerThread.getLooper()) {
        public void handleMessage (Message msg) {
        }
    };
    

    请注意,在上面的描述中,类根本没有发挥作用,因为类是代码的结构方式,与代码在哪个线程上执行无关。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-08-05
      • 2011-05-08
      相关资源
      最近更新 更多