Android: возможно ли блокирование фонового потока, пока поток пользовательского интерфейса не завершит работу? - PullRequest
6 голосов
/ 20 июля 2010

Возможно ли фоновому потоку поставить в очередь сообщение обработчику основного потока пользовательского интерфейса и заблокировать его до тех пор, пока это сообщение не будет обработано?

В этом контексте я хотел бы, чтобы моя удаленная служба обслуживала каждую опубликованную операцию из своего основного потока пользовательского интерфейса, а не из потока пула потоков, из которого она получила запрос IPC.

1 Ответ

5 голосов
/ 09 мая 2011

Это должно делать то, что вам нужно. Он использует notify() и wait() с известным объектом, чтобы сделать этот метод синхронным по своей природе. Все, что находится внутри run(), будет выполняться в потоке пользовательского интерфейса и вернет управление на 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);
        }
    }
}
...