RxAndroid可观测跳过doOnComplete()
我正在同时调用多个改型api并等待它的完成,这是由RxAndroid可观测跳过doOnComplete(),android,rx-java,retrofit2,rx-android,Android,Rx Java,Retrofit2,Rx Android,我正在同时调用多个改型api并等待它的完成,这是由Observable.zip()正确完成的。现在我想实施进展 这是我的实现。 private void preFetchData() { ApiInterface apiService1 = ApiClient.getWooRxClient().create(ApiInterface.class); ApiInterface apiService2 = ApiClient.getRxClient().create(ApiInter
Observable.zip()
正确完成的。现在我想实施进展
这是我的实现。
private void preFetchData() {
ApiInterface apiService1 = ApiClient.getWooRxClient().create(ApiInterface.class);
ApiInterface apiService2 = ApiClient.getRxClient().create(ApiInterface.class);
Map<String, String> map1 = new HashMap<>();
map1.put("on_sale", "true");
Observable<List<Product>> call1 = apiService1.getProducts1(map1)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> {
progress += 18;
Log.e("Progress1", progress + "");
mProgressBar.setProgress(progress);
mProgressBar.setProgressText(progress + "%");
});
Map<String, String> map2 = new HashMap<>();
map2.put("featured", "true");
Observable<List<Product>> call2 = apiService1.getProducts1(map2)
.subscribeOn(Schedulers.io())
.delaySubscription(100, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> {
progress += 18;
Log.e("Progress2", progress + "");
mProgressBar.setProgress(progress);
mProgressBar.setProgressText(progress + "%");
});
Map<String, String> map3 = new HashMap<>();
map3.put("page", "1");
map3.put("sort", "rating");
map3.put("per_page", "10");
Observable<List<Product>> call3 = apiService2.getCustomProducts1(map3)
.subscribeOn(Schedulers.io())
.delaySubscription(200, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> {
progress += 18;
Log.e("Progress3", progress + "");
mProgressBar.setProgress(progress);
mProgressBar.setProgressText(progress + "%");
});
Map<String, String> map4 = new HashMap<>();
map4.put("page", "1");
map4.put("sort", "popularity");
map4.put("per_page", "10");
Observable<List<Product>> call4 = apiService2.getCustomProducts1(map4)
.subscribeOn(Schedulers.io())
.delaySubscription(300, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> {
progress += 18;
Log.e("Progress4", progress + "");
mProgressBar.setProgress(progress);
mProgressBar.setProgressText(progress + "%");
});
Observable<ResponseBody> call5 = apiService2.getCurrencySymbol()
.subscribeOn(Schedulers.io())
.delaySubscription(400, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> {
progress += 10;
Log.e("Progress5", progress + "");
mProgressBar.setProgress(progress);
mProgressBar.setProgressText(progress + "%");
});
Observable<List<Category>> call6 = apiService1.getAllCategories()
.subscribeOn(Schedulers.io())
.delaySubscription(500, TimeUnit.MILLISECONDS)
.observeOn(AndroidSchedulers.mainThread())
.doOnComplete(() -> {
progress += 18;
Log.e("Progress6", progress + "");
mProgressBar.setProgress(progress);
mProgressBar.setProgressText(progress + "%");
});
Observable<CombinedHomePage> combined = Observable.zip(call1, call2, call3, call4, call5, call6, CombinedHomePage::new);
disposable = combined.subscribe(this::successHomePage, this::throwableError);
}
private void successHomePage(CombinedHomePage o) {
Log.e("Response", "SUCCESS " + o.featuredProductList.size());
Log.e("Response", "SUCCESS " + o.saleProductList.size());
Log.e("Response", "SUCCESS " + o.topRatedProductList.size());
Log.e("Response", "SUCCESS " + o.topSellerProductList.size());
Log.e("Response", "SUCCESS " + o.CURRENCY);
Log.e("Response", "SUCCESS " + o.categoryList.size());
}
private void throwableError(Throwable t) {
Log.e("Response", "Fail");
}
第二轮
在第一次运行过程中跳过4次,在第二次运行过程中跳过3次(所有Api都正确完成)
知道为什么会这样吗
任何帮助都将受到欢迎以下内容对其进行了描述:
运算符按指定的顺序订阅其源,如果其中一个源比其他源短,则在处理其他源时急切地完成。因此,这些其他源可能永远无法运行到完成(因此不调用doOnComplete()。如果源的长度完全相同,也可能发生这种情况;如果源A已完成,而B已被消耗并即将完成,则操作员检测到A将不会发送进一步的值,并将立即处理B。例如:
zip(数组.asList(范围(1,5).doOnComplete(操作1),
范围(6,5)。完成(操作2)),(a)->a)
将调用action1,但不会调用action2。
若要处理此终止属性,请同时使用doOnDispose(Action)或使用using()在完成或dispose()调用时进行清理
其描述见:
运算符按指定的顺序订阅其源,如果其中一个源比其他源短,则在处理其他源时急切地完成。因此,这些其他源可能永远无法运行到完成(因此不调用doOnComplete()。如果源的长度完全相同,也可能发生这种情况;如果源A已完成,而B已被消耗并即将完成,则操作员检测到A将不会发送进一步的值,并将立即处理B。例如:
zip(数组.asList(范围(1,5).doOnComplete(操作1),
范围(6,5)。完成(操作2)),(a)->a)
将调用action1,但不会调用action2。
若要处理此终止属性,请同时使用doOnDispose(Action)或使用using()在完成或dispose()调用时进行清理
好的,兄弟,谢谢,但是你能为解决方案提供伪代码吗?我对rxjava还不熟悉
doOnDispose()
可能在失败的情况下调用?在这种情况下使用doOnNext()
可能有意义,只需将doOnComplete
替换为doFinally
,或者正如John O'reilly建议的那样,doOnNext
如果您知道每个源代码只有一个条目。谢谢@JohnO'Reilly和@akarnokddoOnNext
工作正常。好的,兄弟,谢谢,但您能为解决方案提供伪代码吗我是rxjava新手doOnDispose()
可能在失败的情况下调用?在这种情况下使用doOnNext()
可能有意义,只需将doOnComplete
替换为doFinally
,或者正如John O'reilly建议的那样,doOnNext
如果您知道每个来源只有一个项目。谢谢@JohnO'Reilly和@akarnokddoOnNext
工作正常。
E/Progress5: 10.0
E/Progress2: 28.0
E/Progress1: 46.0
E/Progress6: 64.0
E/Progress3: 82.0
E/Response: Featured List Size 5
E/Response: Sale List Size 7
E/Response: Rated List Size 10
E/Response: Seller List Size 10
E/Response: Currency $
E/Response: Category List Size 9
E/Progress5: 10.0
E/Progress2: 28.0
E/Progress1: 46.0
E/Progress6: 64.0
E/Progress4: 82.0
E/Response: Featured List Size 5
E/Response: Sale List Size 7
E/Response: Rated List Size 10
E/Response: Seller List Size 10
E/Response: Currency $
E/Response: Category List Size 9