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() およびハンドラ メソッドのコードの周りに、同期やセマフォなどを用意する必要がありますか?