gpt4 book ai didi

android - Android/DalvikVM 如何处理 Handlers?

转载 作者:搜寻专家 更新时间:2023-11-01 08:16:09 27 4
gpt4 key购买 nike

我想知道 Handlers 在 Android/DalvikVM 中是如何处理的。我正在为 Android 编写一个应用程序,在一个类中我有一个 Handler 方法可以从另一个类接收消息。 Handler 方法会充当线程并与同一类中的 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 将自身与创建它的任何线程相关联(假设该线程已经有一个循环程序)。默认情况下,Android 回调在名为“main”的线程上运行,该线程也称为 ui 线程。无论从哪个线程调用 post 方法,handleMessage 方法都会从创建 Handler 的线程(通常是“主”线程)调用。因为 handleMessage 方法总是在同一个线程中调用,所以一次只会处理一条消息。

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

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

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

关于android - Android/DalvikVM 如何处理 Handlers?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4649662/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com