我有一个单例,它保存对我的数据库对象的引用。我想做的是将任何数据库操作限制为单个 IO 线程。
首先我尝试了以下方法:
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 的新手(看起来它有很多陷阱),我问:保持 Scheduler 对象处于 Activity 状态有什么坏处吗(请记住,SQLSingleton 是一个单例,因此调度程序也将是)?
最佳答案
schedulerIODatabase = Schedulers.newThread();
这没有效果,因为 newThread
每次应用 subscribeOn
时都会分发一个新线程,类似于 io()
但没有线程重用。
您无法在 RxJava 1.x 中固定和重用特定的 RxJava 线程,但您可以在 RxJava 2 中使用其扩展库组件来做到这一点:SharedScheduler .
在 RxJava 1 中,您必须向 Schedulers.from
提供自己的单线程 ExecutorService
,然后它将使用该单个 Executor
所有 worker 调用。请注意,您必须手动管理 ExecutorService
的生命周期,并在应用必须终止时将其关闭:
ExecutorService exec = Executors.newSingleThreadedExecutor();
Scheduler singleScheduler = Schedulers.from(exec);
Observable.fromCallable(() -> {
//database operations here
})
.subscribeOn(singleScheduler)
.observeOn(AndroidSchedulers.mainThread());
// ...
exec.shutdown();
关于android - RxJava (Android) - 保持调度程序存活有什么坏处吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41353805/