簡體   English   中英

RxJava 2在新線程中創建列表

[英]RxJava 2 creating list in new Thread

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

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() {

                }
            });

但是很容易看到,list在主線程中創建並完成,那么如何使用rxJava在一個全新的線程中創建它呢?

你想要的是Observable.fromCallable()

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

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

無論訂閱是否發生, Observable.create()都會立即執行,這就是為什么建議謹慎使用它。

正如Artem Zinnatullin的帖子所述:

如果可以的話,不要使用Observable.create(),這很容易在腳下射擊! (然后再為每個新用戶拍攝!)

這里的問題是, 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
})

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM