Android Observables.zip 列出可观察对象

标签 android rx-java observable

我需要向服务器执行多个并行请求以检索数据。我如何使用可观察对象来做到这一点。 我的实现

public void get(String s, Observer<Boolean> observer) {
    APIService apiService = App.getApi();
    final Observable<User> oUser = apiService.getUser(Integer.valueOf(s));
    final Observable<List<DocType>> oDocType = apiService.getDocType();
    final Observable<List<TaskTypes>> oTaskTypes = apiService.getTaskType();
    final Observable<List<DocTaskLeave>> oTaskLeave = apiService.getTaskLeave();
    final Observable<List<DocStatus>> oDocStatus = apiService.getDocStatus();
    final Observable<List<DocPayment>> oDocPayment = apiService.getPaymentType();
    final Observable<List<DocCredit>> oDocCredit = apiService.getPaymentCredit();
    final Observable<List<ClientRegion>> oClientRegion = apiService.getClientRegion();
    final Observable<List<ProductRules>> oProductRules = apiService.getProductsRules();
    final Observable<List<ReportTypes>> oReportTypes = apiService.getReportType();
    List<Observable> observables = new ArrayList<>();
    observables.add(oUser);
    observables.add(oDocType);
    observables.add(oTaskTypes);
    observables.add(oTaskLeave);
    observables.add(oDocStatus);
    observables.add(oDocPayment);
    observables.add(oDocCredit);
    observables.add(oClientRegion);
    observables.add(oProductRules);
    observables.add(oReportTypes);
    Observable obs = Observable.zip(observables, new FuncN() {
        @Override
        public Object call(Object... args) {
            return null;
        }
    });
    obs.subscribe(observer);
}

我认为这是错误的,因为。 IDE 显示警告。 enter image description here

最佳答案

使用 zip 的解决方案会很丑陋和冗长,因为您有多达 10 个可观察对象,每个都是不同的类型。此外,在将每个结果存储到数据库之前,您需要将其转换为正确的类型。

由于您的目标是获取和存储各种数据(如我所见),我会将每个任务表示为一个单独的 Completable,在其自己的 Scheduler 上执行>:

final Completable oUser = apiService.getUser(Integer.valueOf(s))
        .doOnNext(result -> /* save to db */) // or flatMap
        .toCompletable()
        .retry(3) // in case of upstream error - retries this task (up to 3 times)
        .onErrorComplete() // replaces upstream errors with onCompleted event
        .subscribeOn(Schedulers.io());

final Completable oDocType = apiService.getDocType()
        .doOnNext(result -> /* save to db */)
        .toCompletable()
        .retry(3)
        .onErrorComplete()
        .subscribeOn(Schedulers.io());

// ... etc

Completable.merge(oUser, oDocType, oTaskTypes, oTaskLeave, oDocStatus, 
        oDocPayment, oDocCredit, oClientRegion, oProductRules, oReportTypes)
            .subscribe(new CompletableSubscriber() {
                @Override
                public void onCompleted() {
                    // all done!
                }

                @Override
                public void onError(Throwable e) {
                    // handle error
                }

                @Override
                public void onSubscribe(Subscription d) {
                    // manage subscription if needed
                }
            });

所有任务并行执行。此外,您可以为每个请求或任何其他附加逻辑设置重试次数。

关于Android Observables.zip 列出可观察对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46036725/

相关文章:

angular - RxJS 仅从数组中获取已更改的对象

java - Android:检索其他应用程序的共享首选项(已root的设备)

android - 在进程死亡时以编程方式处理取消注册 BroadcastReceiver

java - IncompatibleClassChangeError : Class 'java.lang.VirtualMachineError' does not implement interface 'java.lang.CharSequence'

angular - Typescript 中的多个可观察对象问题

java - RxJava : How to Subscribe only if the Observable is Cold?

android - 如何在 Android 上的 SQLite 中使用 CASE WHEN 对两个字段求和

java - Eclipse 不会运行 :\. 元数据\.log 错误

rx-java - RxJava - 将冷可观察对象转换为热可观察对象

android - RxJava 使用 zip 链接多个调用