![](/img/trans.png)
[英]Using retrofit2 and RxAndroid to get response from Spring WebFlux
[英]RxAndroid - 1 Response From Multiple Observables
我正在尝试学习RxAndroi,所以问题就像在Title上一样。
1个来自多个可观察对象的响应
我想从这2个请求中获得1个响应。
或2号选项我也想知道如何同步它们。
在第一个请求完成后再执行第二个请求。
示例代码:
Observable<List<CategoriesTreeModel>> categoriesTreeObservable = ApiManager.getInstanceApi().getCategoriesTree();
Subscription treeSubscription = categoriesTreeObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<List<CategoriesTreeModel>>() {
@Override
public void onCompleted() {
Log.e("CATALOG", "getCategoriesTree() complete");
}
@Override
public void onError(Throwable e) {
Log.e("CATALOG", "getCategoriesTree() error");
}
@Override
public void onNext(List<CategoriesTreeModel> categoriesTreeModels) {
Log.e("CATALOG", "getCategoriesTree() next");
}
});
Observable<ResponseModel<CategoriesResponse>> categoriesObservable = ApiManager.getInstanceApi().getCategories();
Subscription subscription = categoriesObservable
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<ResponseModel<CategoriesResponse>>() {
@Override
public void onCompleted() {
Log.e("CATALOG", "getCategories() complete");
}
@Override
public void onError(Throwable e) {
Log.e("CATALOG", "getCategories() error");
}
@Override
public void onNext(ResponseModel<CategoriesResponse> categoriesResponseResponseModel) {
Log.e("CATALOG", "getCategories() onNext");
}
});
编辑:这是正确的方式吗?
Observable.zip(categoriesObservable, categoriesTreeObservable, new Func2<ResponseModel<CategoriesResponse>, List<CategoriesTreeModel>, Object>() {
@Override
public Object call(ResponseModel<CategoriesResponse> categoriesResponseResponseModel, List<CategoriesTreeModel> categoriesTreeModels) {
for (int i = 0; i < categoriesResponseResponseModel.getList().size(); i++){
Log.e("RESPONSE", "CATEGORIES: " + categoriesResponseResponseModel.getList().get(i).getCategory_id() + " NAME: " + categoriesResponseResponseModel.getList().get(i).getTranslations().getPl_PL().getName());
}
for (int i = 0; i < categoriesTreeModels.size(); i++){
Log.e("RESPONSE", "TREE: ID " + categoriesTreeModels.get(i).getId() + " CHILD: " + (categoriesTreeModels.get(i).getChildren().size() > 0 ? " has children " : "no child"));
}
return null;
}
})
.subscribeOn(Schedulers.newThread())
.observeOn(AndroidSchedulers.mainThread())
.subscribe();
阅读有关MVP模式的知识,以便将数据逻辑与视图逻辑分开。 最简单的解决方案是“先完成后再执行第二个请求”。 如下所示。 这种模式并不是世界上最好的,但是至少它将为您提供一些您可以引用的代码。
final Observable<String> firstObservable = Observable.just("A")
.delay(5, TimeUnit.SECONDS)
.doOnNext(new Action1<String>() {
@Override
public void call(String s) {
Log.d(TAG, "call: " + s);
}
});
firstObservable
.subscribe();
final Observable<String> secondObservable = firstObservable
.flatMap(new Func1<String, Observable<String>>() {
@Override
public Observable<String> call(String s) {
return Observable.just(s + "B").delay(2, TimeUnit.SECONDS); // Make some api call
}
});
secondObservable.subscribe(new Action1<String>() {
@Override
public void call(String s) {
Log.d(TAG, "call: " + s);
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.