2017-02-05 53 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答案正确的,因为他是第一个。 –