我有一個持有對我的數據庫對象的引用的單例。我想要做的是將任何數據庫操作限制爲單個IO線程。RxJava(Android) - 保持調度程序是否有任何傷害?
首先,我試着用以下幾點:
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是一個單身,因此該調度也將)?
感謝您對@akarnokd提出的寶貴意見。您能否澄清一下我將如何「手動管理您的ExecutorService的生命週期並在應用程序終止時關閉它」?我應該在我的應用程序對象的onDestroy方法上做到這一點?我的印象是,我不必關心這些東西,因爲這些對象是單身人士,因此如果應用程序關閉,它們將被正確「收集」。 – Tiago
我不知道Android是否自動關閉ExecutorServices,它肯定不會在桌面Java應用程序中發生。 onCreate/onDestroy對聽起來很合理。 – akarnokd