组合在不同线程中运行的两个Observable

时间:2016-03-03 04:28:15

标签: rx-java

这是我想要实现的目标:

  1. 查询数据库并发出项目。这在db thread上运行。
  2. 在步骤1之后,调用api刷新并将新结果保存到db中,然后发出新结果。这在网络线程上运行。
  3. 所以我的问题是,如何将两者合并为一个Observable并让订阅者更新每个onNext()中的ui?这是我当前的代码,感觉有点反模式:

    public Observable<List<Expense>> call() {
                        return Observable.create(new Observable.OnSubscribe<List<Expense>>() {
                            @Override
                            public void call(final Subscriber<? super List<Expense>> subscriber) {
                                List<Expense> expenses = fromLocal();
                                subscriber.onNext(expenses);
                                GetExpensesJob getExpensesJob = job.get();
                                getExpensesJob.setPage(page).setCount(count);
                                if (expenses == null || expenses.size() == 0 || getExpensesJob.shouldRun()) {
                                    getExpensesJob.run().doOnNext(new Action1<List<Expense>>() {
                                        @Override
                                        public void call(List<Expense> expenses) {
    
                                            if (expenses != null) {
    
                                                .... save in db...
                                                subscriber.onNext(expenses);                                            
                                            }
                                        }
                                    }).doOnError(new Action1<Throwable>() {
                                        @Override
                                        public void call(Throwable throwable) {
                                            subscriber.onError(throwable);
                                        }
                                    }).subscribeOn(ApiModule.scheduler()).subscribe();
    
                                }
                            }
                        }).subscribeOn(Schedulers.io())
    
                                .observeOn(AndroidSchedulers.mainThread());
    
                    }
                },
                new Action2<ExpensesView, List<Expense>>() {
                    @Override
                    public void call(ExpensesView expensesView, List<Expense> response) {
                        expensesView.stopLoading();
                        expensesView.onData(response);
                    }
                },
                new Action2<ExpensesView, Throwable>() {
                    @Override
                    public void call(ExpensesView expensesView, Throwable throwable) {
                        expensesView.showError(throwable);
                    }
    

1 个答案:

答案 0 :(得分:2)

(代表OP发布)

我还没有收到任何答案,但我想出了如何做到这一点。如果这对您有帮助,代码将如下:

Observervable dbObs = Observabe.create(...).subscribeOn(...);     
Observable  apiObs = Observable.create(...).subscribeOn(...);    
Observable.concat(dbObs,apiObs).subscribe(...)

这里的诀窍是你需要从你的observable调用subscriber.onComplete,否则后续的Observable不会获得订阅。