Multiple Async 在 java 中真的很丑,样板太多。以下是您如何手动滚动您需要的东西。但我建议也研究一下图书馆。
#1 的解决方案
如果你很好地分解你的代码,这里就没有嵌套(至少不是很明显):
如果您已经拥有必要的数据,您甚至可以从链的中间开始。
本质上,您可以基于 VK 类制作自己的异步接口,但 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 了解中断!