2017-01-21 2 views
1
Observable.create(new Observable.OnSubscribe<Integer>() { 
    @Override 
    public void call(Subscriber<? super Integer> subscriber) { 
     subscriber.onStart(); 
     subscriber.onNext(1); 
     subscriber.onCompleted(); 
    } 
}).delaySubscription(5, TimeUnit.SECONDS).subscribe(new Subscriber<Integer>() { 
    @Override 
    public void onCompleted() { 
     Log.e("TAG", String.format("(%s) - onCompleted", System.currentTimeMillis())); 
    } 

    @Override 
    public void onError(Throwable e) { 
     Log.e("TAG", String.format("(%s) - onError", System.currentTimeMillis()), e); 
    } 

    @Override 
    public void onNext(Integer integer) { 
     Log.e("TAG", String.format("(%s) - onNext: %s", System.currentTimeMillis(), integer)); 
    } 

    @Override 
    public void onStart() { 
     super.onStart(); 
     Log.e("TAG", String.format("(%s) - onStart", System.currentTimeMillis())); 
    } 
}); 

出力:rxjava ONSTARTイベント

(1485004553817) - onStart 
(1485004558818) - onNext: 1 
(1485004558819) - onCompleted 

onStartイベントがdelaySubscriptionに待っていると、すぐに呼び出していない理由は?

call方法は

答えて

2

ドキュメントが言う呼び出されたとき、私は認識してほしい -

ONSTART -

この方法は、加入者と観察可能に接続されていたときに呼び出されるが、観察可能がまだに開始されていませんアイテムを送信したり、通知を購読者に送信することができます。

delaySubscription:

は、時間の所定量によって観察ソースへのサブスクリプションを遅らせること観測を返します。

onNextは、サブスクリプションが達成されたときにのみ呼び出されます。 onStartは、接続が確立された瞬間と呼ばれます。したがって、定義に従って、期待どおりに動作します。

コードsubscriber.onStart();のコメントを試すことができます。同じものを再度実行して、onStartが最初から呼び出されていることを確認します。意図的実行は、実際には私たちが作成した実際のサブスクライバではなく、(OnSubscribeDelaySubscriptionタイプの)delaySubscriptionの結果であったため、このメソッドを実際に呼び出すことはありませんでした。私たちは、timerを初期化し、タイマーが実行されると、私たちは同じでなければなりませんflatMapでいくつかのタスクを実行

public static void main(String[] args) throws UnsupportedEncodingException, IOException { 
     Observable.timer(5, TimeUnit.SECONDS).flatMap(val -> { 
      System.out.println("Initialize"); 
      return Observable.create(subscriber -> { 
       System.out.println("onsubscribe"); 
       doMyAsyncStuff(subscriber); 
      }); 
     }).subscribe(val -> System.out.println(val)); 

     Observable.timer(10, TimeUnit.SECONDS).toBlocking().first(); 
    } 

:以下

は、おそらくあなたが探しているものを達成することができますスニペットですあなたは先に onStartで何をしましたか?そのタスクが実行されると、 Observableが発行され、先に onNextが呼び出されたときに消費した可能性があるすべての要素が放出されます。

+0

これまでに達成したソリューションは何ですか? –

+0

ユースケースを詳しく説明できれば助かります。 onStartで何を実行したいのですが、onNextとonCompleteを使用する場合はどうしますか? –

+0

私は 'call'メソッドで長い操作をしています。長い操作が開始されたときにプログレスバーを表示します。 –

関連する問題