Подождите с завершением функции, пока не придет обратный вызов - PullRequest
0 голосов
/ 10 декабря 2018

Я пытаюсь реализовать механизм, который позволит мне ждать с завершением функции (в частности, с обратным вызовом), пока я не получу некоторый ответ внутри получателя.Получатель ожидает ответа от какого-либо вызова API или другой длительной операции.

Я пытался выполнить цикл while, который работает на логическом флаге (volatile), который должен был быть изменен в приемнике, но в результате цикл работал вечно, а флаг никогда не меняется.

Также я попытался реализовать механизм уведомления об ожидании, но также функция ожидания «блокирует» приемник для уведомления о вызове.

РЕДАКТИРОВАТЬ: также я пытался использовать BlockingQueue, но здесь тоже не повезло.

Я прилагаю пример кода с моей реализацией.

public String getRemoteInfo() {
    getInfo();
    while (!finished){
        Uninterruptibles.sleepUninterruptibly(200, TimeUnit.MILLISECONDS);
    }
    return globalResult;
}

private void getInfo(){
    service.getInfo(this); //"this" is an implementation of receiver
}

@Override
public void infoReceived(String result) {
    globalResult = result;
    finished = true;
}

1 Ответ

0 голосов
/ 10 декабря 2018

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

Обратите внимание, что вы НИКОГДА не должны ждать, как это в потоке пользовательского интерфейса, так как ваше приложение перестанет отвечать на запросы во время ожидания.

...