我有一个包含对我的数据库对象的引用的单例。我想做的是将任何数据库操作限制为单个 IO 线程。
首先,我尝试了以下方法:
class SQLSingleton{
...
public Observable<MyObject> query(final String id){
return Observable.fromCallable(() -> {
//database operations here
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
...
}
这种方法的问题是 Schedulers.io() 可能会为每个订阅我上面的 observable 的订阅者从其池中提供一个不同的线程(我不希望这样,我希望代码在同一个线程上执行每时每刻)。
然后我转向自己持有调度程序的方法:
class SQLSingleton{
private final Scheduler schedulerIODatabase;
public SQLSingleton(){
schedulerIODatabase = Schedulers.newThread();
}
public Observable<MyObject> query(final String id){
return Observable.fromCallable(() -> {
//database operations here
})
.subscribeOn(schedulerIODatabase)
.observeOn(AndroidSchedulers.mainThread());
}
...
}
由于我是 RxJava 的新手(而且它看起来有很多陷阱),我问:保持 Scheduler 对象处于活动状态有什么害处(请记住 SQLSingleton 是单例,因此 Scheduler 也将是)?