我有一个包含对我的数据库对象的引用的单例。我想做的是将任何数据库操作约束到单个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是一个单身,因此调度程序也将是?)
答案 0 :(得分:3)
schedulerIODatabase = Schedulers.newThread();
这没有任何效果,因为newThread
每次应用subscribeOn
时都会发出一个新线程,类似于io()
但没有线程重用。
您无法在RxJava 1.x中固定和重用特定的RxJava线程,但您可以在RxJava 2中使用其扩展库组件SharedScheduler来执行此操作。
在RxJava 1中,您必须提供自己的单线程ExecutorService
到Schedulers.from
,然后将使用该单Executor
进行所有工作者调用。请注意,您必须手动管理ExecutorService
生命周期,并在应用必须终止时关闭它:
ExecutorService exec = Executors.newSingleThreadedExecutor();
Scheduler singleScheduler = Schedulers.from(exec);
Observable.fromCallable(() -> {
//database operations here
})
.subscribeOn(singleScheduler)
.observeOn(AndroidSchedulers.mainThread());
// ...
exec.shutdown();