我MyDataService
并行收集多个GetSomeDataThread
的数据。每个GetSomeDataThread
都会通过RequestFuture
和StringRequest
向同步请求数据。
我有超时。我通过将请求包装成另一个Thread
和Runnable
解决了这个问题。
超时已消失,但我现在正在异步获取数据 (请参阅call()
中的评论)。
我在SO上找到了很多好的答案,但没有重复。
有什么想法吗?提前谢谢!
编辑:要澄清目标:result[0]
应包含future.get()
的内容,但其中包含默认值"nothing"
。我可能需要等待run()
完成,但不知道如何。
编辑2:我可以在StringRequest
中使用call()
(异步),但在未来(同步)中则不能。如果我使用StringRequest
而没有将其与另一个Thread
包装在一起,则应用会冻结,并且我会在一段时间后获得超时异常(网址很好)。
public class MyDataService extends Service {
// ...
protected Summary summary;
protected void loadSummary() throws Exception {
Collection<GetSomeDataThread> threads = new ArrayList<>();
// loop
threads.add(new GetSomeDataThread("a"));
threads.add(new GetSomeDataThread("b"));
threads.add(new GetSomeDataThread("c"));
ExecutorService executorService = Executors.newFixedThreadPool(threads.size());
List<Future<JSONObject>> results = executorService.invokeAll(threads);
for (Future<JSONObject> result : results) {
// do something with the result:
// result.get()
}
executorService.shutdown();
}
}
-
public class GetSomeDataThread implements Callable<JSONObject> {
// ...
public GetSomeDataThread(String actionId) {
// ...
url += "&actionId=" + actionId;
}
@Override
public JSONObject call() throws Exception {
final String[] result = {"nothing"};
Thread t = new Thread(new Runnable() {
@Override
public void run() {
RequestFuture<String> future = RequestFuture.newFuture();
StringRequest request = new StringRequest(Request.Method.GET, url, future, future);
requestQueue.add(request);
result[0] = future.get();
Log.d(LOG_TAG, result[0]); // outputs the correct value, but delayed
Thread.currentThread().interrupt();
}
});
t.start();
// TODO: wait for thread + runnable to finish
// t.join(); just blocks
// result[0] equals "nothing"
return new JSONObject().put("result", result[0]);
}
}