2016-12-28 10 views
1

私は観察可能なものから最初の項目を受け取った後で購読を中止しようとしています。そして、それは動作していないようです。私は間違って何をしていますか?RxJava:OnNext購読中止は機能していません

結果は、無限ループで "Hello World"と表示されるようです。

+0

http://stackoverflow.com/q/30046124/697313 - 議論を関連。 –

答えて

0

私はTomasz Nurkiewiczの本を読んでいる間、この例をしました。彼は後ほど同様の例を持ち、私のコードに何が間違っているのかを説明しました。

無限ループは悪です!観測可能なラムダ式を作成したので、メインスレッドのコンテキストで実行され、ブロックを無期限にサブスクライブしています。観察可能なcreate lambdaを別のスレッドで実行するには、メインスレッドが決してブロックされず、subscribe()が完了しないことを意味します。私はサブスクリプションにIOスレッドで起こるように頼んだが、それはトリックをした。つまり、IOスレッドで無限ループが起こっていて、メインスレッドをブロックしていない。

strObservable.subscribeOn(Schedulers.io()).subscribe(strSubscriber); 
+0

私はこれが脱退の問題を解決するとは思わない。 'main()'の最後に 'Thread.sleep(1000)'を追加してプログラムの終了を遅らせ、どうなるか見てみましょう。 –

1

登録を解除するには、ループ内で登録ステータスを確認する必要があります。それ以外の場合は、無限にCPUが消費されます。

無限の順序に対処する最も簡単な方法は、ライブラリ提供の方法Observable.generate()またはObservable.fromIterable()を利用することです。彼らはあなたのために適切なチェックを行います。

また、異なるスレッドで購読して確認してください。それ以外の場合は、単一のサブスクライバのみを提供します。

あなたの例:

strObservable = Observable.generate(g -> g.onNext("Hello!")); 
strObservable.subscribeOn(Schedulers.newThread()).subscribe(strSubscriber); 
関連する問題