等待先前的Rx Observable完成

时间:2016-03-11 02:05:23

标签: android rx-java

您好我使用RxJava进行磁盘存储获取和设置操作。基本上我有这样的方法:

public Observable<String> getStorageItem(String id, String type) {
    return Observable.defer(new Func0<Observable<String>>() {
        // Run db operations to get storage item.
    }
}

问题在于,此方法getStorageItem(...)可能连续多次订阅。并且observable中的DB操作不能同时运行。我最好的选择是什么?我应该手动创建一些排序队列吗?或者RxJava是否有某种工具允许我阻止操作直到前一个操作完成?

1 个答案:

答案 0 :(得分:2)

您可以将subscribeOn与从ExecutorService创建的单线程调度程序一起使用,以确保只有一个正在进行的数据库操作:

ExecutorService exec = Schedulers.newSingleThreadExecutor();
Scheduler s = Schedulers.from(exec);

public Observable<String> getStorageItem(String id, String type) {
    return Observable.fromCallable(() -> {
        // Do DB operations 
    });
}

getStorageItem("1", "2").subscribeOn(s).subscribe(...);
getStorageItem("2", "4").subscribeOn(s).subscribe(...);
getStorageItem("3", "6").subscribeOn(s).subscribe(...);

但请注意,通过将计算移出调用者的线程,它可以随时执行。如果您需要单独等待(因为已经在某个线程上调用了getStorageItem),您可以在toBlocking()之后应用subscribeOn