2017-02-05 54 views
2

開發商! 我想在實際項目中使用RxJava,但似乎我並沒有得到它的邏輯正確。我需要在一個新線程中創建一個對象列表。完成後,將此列表發送給觀察員。我發現是:RxJava 2創建列表在新線程

LinkedList<IntroSliderElement> list = new LinkedList<>(); 
    list.add(new IntroSliderElement(0, "test 0", 0)); 
    list.add(new IntroSliderElement(1, "test 1", 1)); 
    list.add(new IntroSliderElement(2, "test 2", 2)); 

    Observable<LinkedList<IntroSliderElement>> listObserv = Observable.just(list); 
    listObserv 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Observer<List<IntroSliderElement>>() { 
       @Override 
       public void onSubscribe(Disposable d) { 

       } 

       @Override 
       public void onNext(List<IntroSliderElement> value) { 
        view().render(new IntroModel.OnFirstSliderElement((LinkedList<IntroSliderElement>) value)); 
       } 

       @Override 
       public void onError(Throwable e) { 

       } 

       @Override 
       public void onComplete() { 

       } 
      }); 

但因爲它是很容易看到,列表創建並在主線程滿足,因此如何使它在使用rxJava一個全新的創建線程?

回答

2

你想大概是什麼Observable.fromCallable()

Observable.fromCallable(() -> { 
    // init your list here 
    yourList = .... 
    Observable.fromIterable(yourList); 
}); 

內部代碼將在訂閱發生時執行。 因此,您可以在您喜歡的線索上執行訂閱。

Observable.create()會立即進行訂購,無論已經發生或沒有,這就是爲什麼它的勸謹慎使用。

正如阿爾喬姆Zinnatullin的職位說明:

不要使用Observable.create()如果可以的話,這是很容易搬起石頭砸自己的腳! (然後再次拍攝爲每個新用戶!)

+0

是的,當然,我忘了寫它,但它不會解決問題。列表將在可觀察之前創建。使用主線程的資源。 –

+0

那麼你想要的是[Observable.fromCallable()](https://artemzin.com/blog/rxjava-defer-execution-of-function-via-fromcallable/)API – azizbekian

+0

謝謝我已經試過這個,一切都按預期工作! –

0

這裏的問題是,運營商just創建一個可觀察的,即只是發出最後一個項目。它對創作本身沒有影響。您需要在OnSubscribe回調中創建此列表,並在準備就緒後發出。然後您可以指定使用subscribeOn運算符在哪個調度程序上運行此函數。

Observable.create(emitter -> { 
    LinkedList<IntroSliderElement> list = new LinkedList<>(); 
    list.add(new IntroSliderElement(0, "test 0", 0)); 
    list.add(new IntroSliderElement(1, "test 1", 1)); 
    list.add(new IntroSliderElement(2, "test 2", 2)); 

    emitter.onNext(list); 
    emitter.onComplete(); 

}) 
.subscribeOn(Schedulers.newThread()) 
.observeOn(/* You should choose the thread on which the result will be processed */) 
.subscribe(result -> { 
    // process the result here 
}) 
+0

非常感謝,你的變化是更簡單,更靈活,我會用它在未來,但我將迎來@azizbekian答案正確的,因爲他是第一個。 –