У меня есть синглтон, который содержит ссылку на мой объект базы данных. Что я хотел бы сделать, так это ограничить любую операцию базы данных одним потоком ввода-вывода.
Сначала я попробовал следующее:
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 (и, похоже, в нем много подводных камней), я спрашиваю: Есть ли какой-либо вред в сохранении этого объекта планировщика (имейте в виду, что SQLSingleton является синглтоном, поэтому что Планировщик и будет)?