这是我想要实现的目标:
所以我的问题是,如何将两者合并为一个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);
}
答案 0 :(得分:2)
(代表OP发布)
我还没有收到任何答案,但我想出了如何做到这一点。如果这对您有帮助,代码将如下:
Observervable dbObs = Observabe.create(...).subscribeOn(...);
Observable apiObs = Observable.create(...).subscribeOn(...);
Observable.concat(dbObs,apiObs).subscribe(...)
这里的诀窍是你需要从你的observable调用subscriber.onComplete,否则后续的Observable不会获得订阅。