2017-08-08 63 views
0

我寫使用RxJava一個倉庫時遇到了問題搞清楚處理寫入和刪除,以回購的最佳方式方法。RxJava,副作用,並返回void

當寫這個,我的目標是確保任何寫入或刪除方法將能夠從RxJava副作用的方法調用。這意味着寫/刪除方法必須同步運行,並且不返回Observable。這樣一來,我可以做這樣的事情:

repository 
    .fetchData() 
    .doOnNext(s -> if (s.equals("something") { 
         repository.writeData(s); 
        } 
    ) 
    .subscribe(); 

這是一個簡單的例子,但它表明我調用返回一個可觀察的倉庫方法,訂閱的觀察到的,當可觀察的onNext()方法被調用我可以執行我的副作用,這是一個同步寫入內存緩存或數據庫。

好了,讓例子的偉大工程,但現在我有一個問題,我只需要編寫或從我的內存緩存或數據庫中刪除數據。也就是說,我想使用RxJava在方法返回void的地方運行同步代碼。

我的版本庫的API是寫我想要做的事,如呼叫repository.deleteData()的方式,但我想這樣做掉主線程。解決這個問題的一種方法是放棄RxJava並創建一個線程來執行任務。這會起作用,但我會用RxJava來做所有其他事情,所以我也想在這裏使用它。

我發現2個可能的解決辦法,但我不知道他們是如何正確的是:

1)使用Observable.just(null)揭開序幕可觀察到的,然後使用doOnNext()副作用的方法來從打電話給我的資料庫的方法。這看起來好像很詭異,但它讓我可以使用RxJava,並讓我指定線程來訂閱/觀察,這使得線程變得容易,並允許存儲庫的API保持不變,以便它仍然返回void。

2)我也可以做一些事情,如Observable.defer(),然後從推遲的調用方法我可以返回Observable.just(repository.deleteData())。如果我這樣做,我必須更改存儲庫的API,以便deleteData方法具有void返回類型而不是void(並且該方法還添加了return null;以履行方法簽名的合同)。這也允許我使用RxJava,指定我想觀察哪些線程並訂閱並繼續使用Observable,即使我真正在做的是副作用。

是否有RxJava一種方式來創建一個可觀察它調用與運行的副作用的方法外同步代碼void返回類型的方法?

+0

此[鏈接](https://github.com/ReactiveX/RxJava/wiki/What's-different-in-2.0#nulls)可以幫助你。考慮rxjava和rxjava2之間的區別,我認爲你的第一個解決方案是常見的用法。 –

+0

所以你想從你的同步方法構造Observables? – yosriz

回答

0

那麼,爲什麼不是這樣?

public static <T> Observable<T> observeCompletion(Runnable r) { 
    return Observable.defer(() -> { 
     r.run(); 
     return Observable.empty(); 
    }; 
} 

現在你可以做的線程跳你通過onSubscribe需要,你把一切都在的Rx。