2017-02-05 7 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

ありがとう、あなたの変種はよりシンプルで柔軟性があり、私は将来それを使用しますが、彼が最初だったので、私はアジズベキアの答えを正しいものとしてマークします。 –

関連する問題