バックグラウンド スレッドがメッセージをメイン UI スレッドのハンドラーのキューに入れ、そのメッセージが処理されるまでブロックすることは可能ですか?
このコンテキストは、リモート サービスが、IPC 要求を受信したスレッドプール スレッドではなく、メインの UI スレッドから発行された各操作を処理するようにしたいということです。
バックグラウンド スレッドがメッセージをメイン UI スレッドのハンドラーのキューに入れ、そのメッセージが処理されるまでブロックすることは可能ですか?
このコンテキストは、リモート サービスが、IPC 要求を受信したスレッドプール スレッドではなく、メインの UI スレッドから発行された各操作を処理するようにしたいということです。
これはあなたが必要とすることをするはずです。notify()andを既知のオブジェクトとともに使用しwait()て、このメソッドを本質的に同期させます。の内部はrun()すべて UI スレッドで実行され、終了すると制御が戻りdoSomething()ます。もちろん、これは呼び出し元のスレッドをスリープ状態にします。
public void doSomething(MyObject thing) {
String sync = "";
class DoInBackground implements Runnable {
MyObject thing;
String sync;
public DoInBackground(MyObject thing, String sync) {
this.thing = thing;
this.sync = sync;
}
@Override
public void run() {
synchronized (sync) {
methodToDoSomething(thing); //does in background
sync.notify(); // alerts previous thread to wake
}
}
}
DoInBackground down = new DoInBackground(thing, sync);
synchronized (sync) {
try {
Activity activity = getFromSomewhere();
activity.runOnUiThread(down);
sync.wait(); //Blocks until task is completed
} catch (InterruptedException e) {
Log.e("PlaylistControl", "Error in up vote", e);
}
}
}