最近我深入研究了一些使用 API 的工作。该API使用Unirest http库来简化从网络接收的工作。当然,由于数据是从 API 服务器调用的,因此我尝试通过使用对 API 的异步调用来提高效率。我的想法结构如下:
- 通过返回 future 的结果来创建数据数组
- 显示数据+从数据收集的附加信息
因此,我需要先返回所有数据,然后才能开始第二步。我的代码如下:
Future < HttpResponse < JsonNode > > future1 = Unirest.get("https://example.com/api").asJsonAsync(new Callback < JsonNode > () {
public void failed(UnirestException e) {
System.out.println("The request has failed");
}
public void completed(HttpResponse < JsonNode > response) {
System.out.println(response.getBody().toString());
responses.put(response);
}
public void cancelled() {
System.out.println("The request has been cancelled");
}
});
Future < HttpResponse < JsonNode > > future2 = Unirest.get("https://example.com/api").asJsonAsync(new Callback < JsonNode > () {
public void failed(UnirestException e) {
System.out.println("The request has failed");
}
public void completed(HttpResponse < JsonNode > response) {
System.out.println(response.getBody().toString());
responses.put(response);
}
public void cancelled() {
System.out.println("The request has been cancelled");
}
});
doStuff(responses);
我该如何做到这一点,以便仅在两个期货完成后才调用 doStuff ?
有几种选择。您现在拥有的代码调用doStuff
来自您提出请求的同一线程。如果您想阻塞直到两个请求都完成,您可以使用 CountDownLatch。就像是:
CountDownLatch responseWaiter = new CountDownLatch(2);
Future <HttpResponse<JsonNode>> future1 = Unirest.get("https://example.com/api").asJsonAsync(new Callback<JsonNode>() {
public void completed(HttpResponse<JsonNode> response) {
responses.put(response);
responseWaiter.countDown();
}
...
});
// Similar code for the other get call
...
responseWaiter.await();
doStuff(responses);
如果您不想在两个调用完成之前阻塞该线程,则可以让每个匿名内部回调类增加一个 AtomicInteger。当计数为 2 时,你会调用doStuff
。就像是:
AtomicInteger numCompleted = new AtomicInteger();
Future <HttpResponse<JsonNode>> future1 = Unirest.get("https://example.com/api").asJsonAsync(new Callback<JsonNode>() {
public void completed(HttpResponse<JsonNode> response) {
responses.put(response);
int numDone = numCompleted.incrementAndGet();
if (numDone == 2) {
doStuff(responses);
}
}
});
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)