首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Android/DalvikVM是如何处理处理程序的?

Android/DalvikVM是如何处理处理程序的?
EN

Stack Overflow用户
提问于 2011-01-11 01:38:13
回答 1查看 1.2K关注 0票数 2

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

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

我的代码结构:

代码语言:javascript
复制
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()和处理程序方法中的代码周围有一些同步或信号量或其他东西,这样我就不会损坏我的缓冲区?

EN

回答 1

Stack Overflow用户

发布于 2011-01-11 07:59:24

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

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

代码语言:javascript
复制
HandlerThread handlerThread = new HandlerThread("Consumer");
handlerThread.start();
Handler consumer = new Handler(handlerThread.getLooper()) {
    public void handleMessage (Message msg) {
    }
};

注意,在上面的描述中,类根本不起作用,因为类是如何构造代码的,这与代码在哪个线程上执行无关。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4649662

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档