Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/228.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
RxAndroid可观测跳过doOnComplete()_Android_Rx Java_Retrofit2_Rx Android - Fatal编程技术网

RxAndroid可观测跳过doOnComplete()

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

我正在同时调用多个改型api并等待它的完成,这是由
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和@akarnokd
doOnNext
工作正常。好的,兄弟,谢谢,但您能为解决方案提供伪代码吗我是rxjava新手
doOnDispose()
可能在失败的情况下调用?在这种情况下使用
doOnNext()
可能有意义,只需将
doOnComplete
替换为
doFinally
,或者正如John O'reilly建议的那样,
doOnNext
如果您知道每个来源只有一个项目。谢谢@JohnO'Reilly和@akarnokd
doOnNext
工作正常。
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