1

Работа с intentservice для получения данных из 7 ссылок Rss Feed с использованием «Google Volley» в фоновом режиме и использования ResultReceiver для получения результата. Но я не могу настроить, как ждать ответа волейбола, чтобы закончить работу флаг с ResultReceiver для отображения данных в MainActivityкак ждать ответа залпа, чтобы закончить работу внутри intenservice?

ответ

5

Вы не должны ждать его. У вас есть два способа сделать сетевой запрос: синхронный и асинхронный. Если вы используете синхронный режим, вы не ждете результата, потому что сетевой вызов является блокировкой.

Смотрите, если вы хотите идти в этом направлении: Can I do a synchronous request with volley?

Если вы хотите сделать это асинхронно, вы просто запустите запрос, а затем использовать ваш ResultReceiver в методе обратного вызова в Response.Listener когда запрос закончен.

см это для деталей: https://guides.codepath.com/android/Networking-with-the-Volley-Library

Если вы все еще думаете, что вы должны блокировать текущий поток и ждать результата, вы должны использовать CountDownLatch. Создайте фоновый поток (вы не можете блокировать поток пользовательского интерфейса в android, если это не отдельный процесс), запустите свою защелку со счетчиком 1 и вызовите метод await(). Это заблокирует ваш фоновый поток до тех пор, пока счет будет равен 0. После завершения фоновой задачи вы вызываете countDown(), который разблокирует фоновый поток, и вы сможете выполнить свое действие.

+0

Я очень благодарен вам за Геннадию :) –

0

На этот вопрос был дан ответ в official Volley Google Group.

Wrap запрос в RequestFuture сделать блокирующий вызов с помощью RequestFuture#newFuture(...);

Вы можете найти пример кода в Volley source code:

RequestFuture<SONObject> future = RequestFuture.newFuture(); 
MyRequest request = new MyRequest(URL, future, future); 

// If you want to be able to cancel the request: 
future.setRequest(requestQueue.add(request)); 

// Otherwise: 
requestQueue.add(request); 

try { 
    JSONObject response = future.get(); 
    // do something with response 
} catch (InterruptedException e) { 
    // handle the error 
} catch (ExecutionException e) { 
    // handle the error 
} 

Обязательно используйте тайм-аут в future.get(...) или иначе ваша нить замок.

Смежные вопросы