RxJava(Android) - 让Scheduler保持活着有什么危害吗?

问题描述 投票:1回答:1

我有一个包含对我的数据库对象的引用的单例。我想要做的是将任何数据库操作约束到单个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也会这样)?

android singleton rx-java scheduler rx-java2
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();
© www.soinside.com 2019 - 2024. All rights reserved.