2

我有一个包含对我的数据库对象的引用的单例。我想做的是将任何数据库操作限制为单个 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 也将是)?

4

1 回答 1

3
schedulerIODatabase = Schedulers.newThread();

这没有任何效果,因为newThread每次应用它时都会分发一个新线程subscribeOn,类似于io()但没有线程重用。

您不能在 RxJava 1.x 中固定和重用特定的 RxJava 线程,但您可以在 RxJava 2 中使用其扩展库组件:SharedScheduler来做到这一点。

在 RxJava 1 中,您必须提供自己的单线程ExecutorServiceSchedulers.from然后将使用该单线程Executor进行所有工作线程调用。请注意,您必须手动管理您ExecutorService的生命周期并在您的应用程序必须终止时将其关闭:

ExecutorService exec = Executors.newSingleThreadedExecutor();

Scheduler singleScheduler = Schedulers.from(exec);

Observable.fromCallable(() -> {
   //database operations here
})
.subscribeOn(singleScheduler)
.observeOn(AndroidSchedulers.mainThread());

// ...

exec.shutdown();
于 2016-12-28T11:07:29.877 回答