android - RxJava (Android) - 保持调度程序存活有什么坏处吗?

标签 android singleton rx-java scheduler rx-java2

我有一个单例,它保存对我的数据库对象的引用。我想做的是将任何数据库操作限制为单个 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/

相关文章:

android - 连接管理器 setNetworkPreference()/getNetworkPreference() : How are they actually used?

python - 在 python 中将参数传递给单例

android - RxJava2 "ProtocolViolationException: Disposable already set!"

java - 为什么 addToBackStack 没有填充 BackStack?

android - 文本在线性布局的 edittext 内滚动,在 android 的 ScrollView 中

android - 在恢复主要 Activity 时更新 TextView

c++ - C++ 中的高效线程安全单例

javascript - 带构造函数的语义 JavaScript 单例

android - RxAndroid 的 Realm 没有获取最新的数据更改

java - 如何在 RxJava 中进行递归 Observable 调用?