RxJava 2在新线程中创建列表

时间:2017-02-05 10:15:54

标签: java android multithreading rx-java rx-android

开发! 我试图在实际项目中使用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在一个全新的线程中创建呢?

2 个答案:

答案 0 :(得分:2)

你想要的是Observable.fromCallable()

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

订阅发生时将执行内部代码。 因此,您可以在您喜欢的主题上执行订阅。

无论订阅是否发生,

Observable.create()都会立即执行,这就是为什么它会谨慎使用它的原因。

正如Artem Zinnatullin的帖子所述:

  

如果可以的话,不要使用Observable.create(),它很容易在脚下射击! (然后再为每个新用户拍摄!)

答案 1 :(得分:0)

这里的问题是just运算符创建了一个observable, 只是 会发出最终项目。它对创作本身没有影响。您需要在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
})