【问题标题】:RxJava 2 creating list in new ThreadRxJava 2 在新线程中创建列表
【发布时间】:2017-02-05 10:15:53
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

    你想要的大概是Observable.fromCallable()

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

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

    Observable.create() 将立即执行,无论是否发生订阅,这就是为什么建议谨慎使用它的原因。

    正如 Artem Zinnatullin 的帖子中所述:

    如果可以,请不要使用 Observable.create(),这很容易自取其辱! (然后为每个新订阅者重新拍摄!)

    【讨论】:

    • 是的,当然,我只是忘记写了,但这并不能解决问题。列表将在可观察之前创建。使用主线程的资源。
    • 那你要的是Observable.fromCallable() API
    • 谢谢,这个我试过了,一切正常!
    【解决方案2】:

    这里的问题是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
    })
    

    【讨论】:

    • 非常感谢,您的变体更简单、更灵活,我将来会使用它,但我会将@azizbekian 的答案标记为正确,因为他是第一个。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-18
    • 2011-12-30
    • 1970-01-01
    相关资源
    最近更新 更多