如何等待凌空响应完成它在intentservice内的工作?

时间:2015-08-04 00:43:39

标签: android rss android-volley intentservice android-intentservice

使用intentservice获取7 Rss Feed链接的数据,并在后台使用“Google Volley”并使用ResultReceiver获取结果,但我无法配置如何等待凌空响应完成它的工作使用ResultReceiver触发标志以显示MainActivity中的数据

2 个答案:

答案 0 :(得分:5)

你不应该等待它。您有两种方式来发出网络请求:同步和异步。如果使用同步,则不要等待结果,因为网络调用是阻塞操作。

如果您想要朝这个方向发展,请参阅此项:Can I do a synchronous request with volley?

如果您想使其异步,您只需启动请求,然后在请求完成后在ResultReceiver回调方法中使用Response.Listener

详情请参阅: https://guides.codepath.com/android/Networking-with-the-Volley-Library

如果您仍然认为应该阻止当前线程并等待结果,则应使用CountDownLatch。创建一个后台线程(你不能在android中阻止UI线程,除非它是一个单独的进程),使用count 1初始化你的latch并调用await()方法。这将阻止您的后台线程,直到计数为0.完成后台任务后,请致电countDown(),这将取消阻止您的后台线程,然后您就可以执行操作了。

答案 1 :(得分:0)

official Volley Google Group回答了这个问题。

使用RequestFuture#newFuture(...);

将请求包裹在RequestFuture中以进行阻止呼叫

您可以在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(...)中使用超时,否则您的线程将锁定。