【问题标题】:Proper Rx Operation for Merging two observables合并两个可观察对象的正确 Rx 操作
【发布时间】:2025-12-18 00:55:02
【问题描述】:

我写了一个下面的类来访问我的 repo,它包括远程 repo 和本地 repo。

public class VenuesRepoImpl implements VenuesRepo {

private VenuesLocalRepo venuesLocalRepo;
private VenuesRemoteRepo venuesRemoteRepo;

public VenuesRepoImpl(VenuesLocalRepo venuesLocalRepo, VenuesRemoteRepo venuesRemoteRepo) {
    this.venuesLocalRepo = venuesLocalRepo;
    this.venuesRemoteRepo = venuesRemoteRepo;
}

@Override
public Observable<List<Venue>> getAllVenues(String ll, int offset) {
    return Observable.merge(venuesRemoteRepo.getAllVenues(ll, offset)
                    .doOnNext(venues -> venuesLocalRepo.addVenues(venues)).subscribeOn(Schedulers.io()),
            venuesLocalRepo.getAllVenues().subscribeOn(Schedulers.io()));
}



@Override
public void deleteAllVenues() {
    Completable.fromAction(() -> venuesLocalRepo.deleteAll()).subscribeOn(Schedulers.io());

}

}

但是Observable.merge 复制了我的项目,它同时具有 api 和 db 项目。 api不可用时如何访问数据库项?

【问题讨论】:

  • 不直接回答你的问题,但如果你声明你的数据库作为你的单一事实来源,你就不必处理这个问题,你会一直显示数据库数据并根据需要更新它来自 api 的数据

标签: android rx-java android-room rx-android


【解决方案1】:

您应该使用concat() 而不是merge()

你可以遵循这个模式:

// Our sources (left as an exercise for the reader)
Observable<Data> memory = ...;
Observable<Data> disk = ...;
Observable<Data> network = ...;

// Retrieve the first source with data
Observable<Data> source = Observable
  .concat(memory, disk, network)
  .first();

更多信息here

【讨论】: