我有一个持有对我的数据库对象的引用的单例。我想要做的是将任何数据库操作限制为单个IO线程。RxJava(Android) - 保持调度程序是否有任何伤害?
首先,我试着用以下几点:
class SQLSingleton{
...
public Observable<MyObject> query(final String id){
return Observable.fromCallable(() -> {
//database operations here
})
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread());
}
...
}
这种方法的问题是,Schedulers.io()可能会从池中订阅了我上面的观察到的每个用户赋予不同的线程(和我不希望这样,我希望代码在任何时候都在同一个线程上执行)。
我然后转移到拿着调度自己的办法:
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(和它看起来像它有很多缺陷的),我问:有什么危害在保持该调度对象活着(请记住,SQLSingleton是一个单身,因此该调度也将)?
感谢您对@akarnokd提出的宝贵意见。您能否澄清一下我将如何“手动管理您的ExecutorService的生命周期并在应用程序终止时关闭它”?我应该在我的应用程序对象的onDestroy方法上做到这一点?我的印象是,我不必关心这些东西,因为这些对象是单身人士,因此如果应用程序关闭,它们将被正确“收集”。 – Tiago
我不知道Android是否自动关闭ExecutorServices,它肯定不会在桌面Java应用程序中发生。 onCreate/onDestroy对听起来很合理。 – akarnokd