您好我使用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是否有某种工具允许我阻止操作直到前一个操作完成?
答案 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
。