2016-12-28 35 views
1

我有一個持有對我的數據庫對象的引用的單例。我想要做的是將任何數據庫操作限制爲單個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是一個單身,因此該調度也將)?

回答

3

schedulerIODatabase = Schedulers.newThread();

,沒有任何效果,因爲每次與subscribeOn應用時,類似io()但沒有線程重用newThread手了一個新的線程。

您不能在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(); 
+0

感謝您對@akarnokd提出的寶貴意見。您能否澄清一下我將如何「手動管理您的ExecutorService的生命週期並在應用程序終止時關閉它」?我應該在我的應用程序對象的onDestroy方法上做到這一點?我的印象是,我不必關心這些東西,因爲這些對象是單身人士,因此如果應用程序關閉,它們將被正確「收集」。 – Tiago

+0

我不知道Android是否自動關閉ExecutorServices,它肯定不會在桌面Java應用程序中發生。 onCreate/onDestroy對聽起來很合理。 – akarnokd