gpt4 book ai didi

java - java中的多个异步请求处理

转载 作者:行者123 更新时间:2023-12-01 22:38:22 25 4
gpt4 key购买 nike

我正在编写 Android 应用程序,它使用一些网站 api。该网站提供了某种 SDK 来处理此 api。我正在使用它向网站发出一些请求。
因此,要提出请求,我应该这样做:

VKRequestListener listener = new VKRequestListener(){
@Override
public void onComplete(VKResponse response){
// do smth when response is complete
}
}
VKRequest vkRequest = new VKRequest("request", "parameters");
vkRequest.executeWithListener(listener);

这个监听器异步运行,所以如果我发出单个请求,一切都会正常:我可以在 onComplete 方法中处理它。但是,如果我需要发出多个请求,而且每个下一个请求都依赖于之前的响应,该怎么办?我只看到两种方式,都看起来很糟糕:
1. onComplete 方法中发出每个下一个请求。这似乎是过于嵌套且不灵活的做法。
2. 进行某种同步操作:在主线程执行请求后,以某种方式检查 onComplete 是否执行(顺便说一句,如何?使用某种标志对象?)如果没有,则执行Thread.sleep(1000),重复此操作直到返回响应,然后再进行另一个响应。
那么,请告诉我是否有“正常”方式来处理多个异步请求?

最佳答案

Java 中的多个异步确实很难看,太多的样板文件。以下是您如何手动卷制所需的内容。但我建议也研究一下图书馆。

#1 的解决方案

如果你很好地分解你的代码,这里没有嵌套(至少不是很明显):如果您已经拥有必要的数据,您甚至可以从链条的中间开始。本质上,您可以基于 VK 类创建自己的异步接口(interface),但 VK 完全隐藏。

class MyRequests {
interface GetStuffResult {
void done(String result, float result2);
// you can even put other callbacks here to help make decisions in the chain
// based on UI element states for example
}

static void startGetStuff1(String param1, String param2, final GetStuffResult result) {
VKRequestListener listener = new VKRequestListener(){
@Override
public void onComplete(VKResponse response){
// extract parameters for next request
String newParameter1 = ...;
int newParameter2 = ...;
startGetStuff2(newParameter1, newParameter2, result);
}
};
VKRequest vkRequest = new VKRequest("request", buildParameters1(param1, param2));
vkRequest.executeWithListener(listener);
}

static void startGetStuff2(String param1, int param2, final GetStuffResult result) {
VKRequestListener listener = new VKRequestListener(){
@Override
public void onComplete(VKResponse response){
// extract parameters for next request
startGetStuff3(newParameter1, newParameter2, newParameter3, result);
}
};
VKRequest vkRequest = new VKRequest("request", buildParameters2(param1, param2));
vkRequest.executeWithListener(listener);
}

static void startGetStuff3(String param1, int param2, Date param3, final GetStuffResult result) {
VKRequestListener listener = new VKRequestListener() {
@Override
public void onComplete(VKResponse response) {
// extract result
result.done(resultingString, resultingFloat);
}
};
VKRequest vkRequest = new VKRequest("request", buildParameters3(param1, param2, param3));
vkRequest.executeWithListener(listener);
}
}

#2 的解决方案

要使异步请求同步,您可以执行以下操作:
只能在后台线程上执行此操作!另请注意,AsyncTask 逐个执行任务,因此如果将其放入 AsyncTask 中,它将阻止其他异步任务执行!

final AtomicReference<VKResponse> result = new AtomicReference<>();
final CountDownLatch latch = new CountDownLatch(1);
VKRequestListener listener = new VKRequestListener(){
@Override
public void onComplete(VKResponse response){
result.set(response);
latch.countDown();
}
};
VKRequest vkRequest = new VKRequest("request", "parameters");
vkRequest.executeWithListener(listener);
// call countDown() even if the request fails if you have an error callback as well!
// and check the existence of response/flag you set if it failed

try {
latch.await();
} catch (InterruptedException e) {
Thread.currentThread().interrupt();
}
VKResponse response = result.get(); // will be null if interrupted
// do smth when response is complete

参见this关于中断!

关于java - java中的多个异步请求处理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26564335/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com