我在这里提出了一个关于Android和Retrofit的新问题。我想知道在Android Activity上处理多个异步调用的正确方法是什么,并且每一个onResponse返回下一个调用所使用的值,因为如果我理解正常,则调用在后台运行,这意味着如果调用没有完成你的返回值将为空,直到你得到一个成功的回复。
我正在考虑用这样的东西来实现这个目标(只有基础):
private List<SomeModel> mylist;
final Call<List<SomeModel>> call1 = client.getSomeValues1();
final Call<List<SomeModel2>> call2 = client.getSomeValues2();
call1.enqueue(new Callback<SomeModel>() {
@Override
public void onResponse(SomeModel> call, Response<SomeModel> response) {
if (response.isSuccessful()) {
// Set mylist to response.body()
mylist = response.body();
}
}
@Override
public void onFailure(Call<SomeModel> call, Throwable t) {
mylist = null;
}
});
call2.enqueue(new Callback<SomeModel2>() {
@Override
public void onResponse(SomeModel2> call, Response<SomeModel2> response) {
if (response.isSuccessful()) {
// Do something with my list and also with call2 response
if(mylist != null) {
for (SomeModel singleObject: mylist) {
// Do something with each object
}
}
}
}
@Override
public void onFailure(Call<SomeModel2> call, Throwable t) {
// Do something with fail call
}
});
之前的例子之类是因为调用在后台运行而且call2可能先完成,然后mylist值将为null,因为call1还没有完成。
此外我还在考虑将call2放在call1 onResponse中,但我感觉不对。我不得不说我还在学习,我是个新秀。
那么,处理这个问题的原因是什么以及如何处理?谢谢。我希望我的问题是可以理解的。
答案 0 :(得分:0)
感谢您的建议@insa_c 我用RXJava2实现了这一点,这就是我用它解释的一般方式:
首先,您需要将api服务定义为Observables
@GET("url-1/")
Observable<List<Model1>> service1();
@GET("url-2/")
Observable<List<Model2>> service2();
现在,您的活动会以这种方式拨打电话:
final Observable<List<Model1>> call1 = APIClient.getClient().create(APIService.class).service1();
final Observable<List<Model2>> call2 = APIClient.getClient().create(APIService.class).service2();
现在让我们用zip制作一个独特的observable(我使用了List,因为我在列表中添加了两种不同类型的对象,当两个调用完成时我将获得这些对象):
<Observable<List<Object>> test = Observable.zip(call1, call2, new BiFunction<List<Model1>, List<Model2>, List<Object>>() {
@Override
public List<Object> apply(List<Model1> objects1, List<Model2> objects2) throws Exception {
List<Object> list = new ArrayList<>();
list.addAll(objects1);
list.addAll(objects2);
return list;
}
}).subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
现在唯一要做的就是订阅并决定你想对这两个回复的内容做些什么:
test.subscribe(new Observer<List<?>>() {
@Override
public void onSubscribe(Disposable d) {
Log.d("TAG", "onSubscribe");
}
@Override
public void onNext(List<?> objects) {
// You can split the list by object in here with an instanceof to determine if it's Model1 or Model2
}
@Override
public void onError(Throwable e) {
e.printStackTrace();
}
@Override
public void onComplete() {
// Do something here, both calls finished, if you stored something in onNext method you can use it here.
}
});
我希望这些信息对某人有用。