2016-06-23 17 views
2

問題は:ObservableSubscriberです。私は(私は、コードが表示されません - 大きすぎる)、それはファイルやジップアーカイバで動作するので、.io()スレッドでObservableを起動しようとするが、私はせずに、コードを起動するとObservableは!:RxJavaがScheduler.io()スレッドで機能しない

Observable<Double> creatingObservable = getCreatingObservable(image); 
Subscriber<Double> creatingSubscriber = getCreatingSubscriber(); 

creatingObservable 
     .subscribeOn(Schedulers.io()) 
     .subscribe(creatingSubscriber); 

何もしませんsubscribeOn() - すべての作品。問題とは何か、それを解決する方法

P.S. System.out.println()も機能しません。問題はすべてのスケジューラーのスレッドを持っています。

+2

問題の説明は、メインスレッドがCreatingObservableが発行する前に終了するように聞こえます。だから確かめてください。最後にThread.sleep(5000)を置くと、まだ動作しませんか? –

+0

@SimonZ。、точно! :о – bukashka101

+0

@SimonZ。つまり、そうです!どのように私は考えたことができます!これを答えに加えてください。 – bukashka101

答えて

6

問題があると思われますcreatingObservableの前にメインスレッドが終了した場合、どの値も出力される可能性があります。

簡単な解決策:メインスレッドがcreatingObservableが放出/完了するのに十分長い時間待ちます。

Observable<Double> creatingObservable = getCreatingObservable(image); 
Subscriber<Double> creatingSubscriber = getCreatingSubscriber(); 

creatingObservable 
     .subscribeOn(Schedulers.io()) 
     .subscribe(creatingSubscriber); 

Thread.sleep(5000); //to wait 5 seconds while creatingObservable is running on IO thread 
1

この場合、アプリケーションはobservableを1回だけ作成します。 Observable.defer(()-> creatingObservable)のいずれかを使用すると、.deferオペレータは毎回観測可能な作成を強制します。

Observable.defer(new Func0<Observable<Double>>() { 
      @Override 
      public Observable<Double> call() { 
       return getCreatingObservable(); 
      } 
     }) 
     .subscribeOn(Schedulers.io()) 
     .observeOn(Schedulers.io()) 
     .subscribe(getCreatingSubscriber); 
2

この方法を試してください。

compile 'io.reactivex:rxandroid:1.2.1' 

をここから:

Subscriber<Double> creatingSubscriber = getCreatingSubscriber(); 
Observable.defer(new Func0<Observable<Double>>() { 
    @Override 
    public Observable<Double> call() { 
     return getCreatingObservable(image); 
    } 
}) 
.subscribeOn(Schedulers.io()) 
.observeOn(AndroidSchedulers.mainThread()) 
.subscribe(creatingSubscriber); 

は、追加することを忘れないでくださいhttps://github.com/ReactiveX/RxAndroid

説明

getCreatingObservable(image); - ほとんどの場合、通話中に「ハード」な作業をする演算子を使用します。例えば

Observable.just(doSomeStuff()) 
    .subscribeOn(...) 
    .observeOn(...) 

したがって、実行プロセスは次のようになります

1)。計算するdoSomeStuff()

2)。結果をObservable.just()

3)に渡します。あなただけがあなたに合格するスケジューラを適用しています

つまり、最初に「ハード」作業をしてから、スケジューラを適用しています。あなたはより多くの説明についてObservable.defer()

を使用する必要がある理由です

は、ダン・ルーのこの記事を読んでください:
http://blog.danlew.net/2014/10/08/grokking-rxjava-part-4/

古い、遅いコード

+0

Thatnks、あなたの提案は非常に便利です。しかし、私の問題は、「観測可能」が開始しようとするとき、他の主な踏み台に閉じ込められていました。そして、 'RxJava-thread'が閉じたときにメインスレッドが待たない理由... – bukashka101

+0

1)。 「メイントレッドクローズ」とはどういう意味ですか?実際には、私は絶対にそれを理解していない....あなたは私のためにそれを明確にすることはできますか? 2)。 "RxJava-thread"とは何ですか? 3)。 RxJavaスレッドが閉じられていますか?あなたが望むなら、私たちはあなたの問題を理解するためにチャットで議論するかもしれません – Alexander

+0

申し訳ありません、私は非常にひどく英語を話します。私は、「メインスレッドが閉じている」と言います。つまり、RxJavaを作成したスレッドの前に、プログラムのメインスレッドが実行されたことを意味します。 RxJava-thread - それはRxJavaが作成したスレッドです(おそらく英語で禁止されているような言葉を作成します.. :))。答えでは、私が受け入れる、私の問題の解決策があります(もちろん、気温は、私はGUIを作成し、私の問題は消えます) – bukashka101

関連する問題