2016-03-22 14 views
0

CODERxAndroid間隔が二回の代わりに一度

heartBeatSub = Observable.interval(HEARTBEAT_INTERVAL, TimeUnit.SECONDS) 
      .flatMap(new Func1<Long, Observable<Notification<Response>>>() { 
       @Override 
       public Observable<Notification<Response>> call(Long aLong) { 
        return api.requestHeartBeat(vehicleId).materialize(); 
       } 
      }) 
      .subscribeOn(Schedulers.io()) 
      .observeOn(AndroidSchedulers.mainThread()) 
      .subscribe(new Action1<Notification<Response>>() { 
       @Override 
       public void call(Notification<Response> responseNotification) { 
        Log.i("HEARTBEAT_INTERVAL", "Response from HEARTBEAT"); 
       } 
      }, new Action1<Throwable>() { 
       @Override 
       public void call(Throwable throwable) { 
        // TODO: 22/03/16 ADD ERROR HANDLING 
       } 
      }); 

PROBLEM

マイcall方法は、間隔ごとに一度の代わりに二回トリガされます。

03-22 11:57:47.236 28078-28078/com.app I/HEARTBEAT_INTERVAL: Response from HEARTBEAT 
03-22 11:57:47.876 28078-28078/com.app I/HEARTBEAT_INTERVAL: Response from HEARTBEAT 

私は持ち歩くまず1:Method threw 'java.lang.NullPointerException' exception. Cannot evaluate rx.Notification.toString() をそしてonNextと呼ばれています。

2番目は通常Responseです。 と呼ばれるonCompleted

========固定コード==========

@Danielルーの助けを借りて、私は自分のコードを修正し、今では正常に

を働いています
+0

ここで 'マテリアライズ 'で達成しようとしていることは何ですか? 1つのonNextイベントと1つのonCompletedという2つのイベントがうまくいくように見えます。 – AndroidEx

答えて

4

materialize()に電話をかけてはいけません。すべての通知(onNext()onCompleted()、およびonError())を自分自身のonNext()コールにリフトします。ここでは悪影響があります。

flatMap()の各APIリクエストは完全Observableです。つまり、onNext(response)onCompleted()の両方を呼び出します。通常flatMap()onCompleted()(​​はまだ完了していません)を転送しませんが、materialize()に電話するので、すべての通知はサブスクライバに転送されます。言い換えれば

、あなたがこれを取得している:(onCompletedの)(あなたの応答とonNext()の)

  1. 通知
  2. 通知

あなたは使用しなかった場合materialize()あなたはあなたが望むものを得るでしょう:

  1. onNext(あなたの回答と共に)。
+1

私の問題を解決した多くの友達に感謝します。 問題を説明してくれてありがとう、私はundestandしなかったように見える 'materialize()'正しく。 – JakubW

関連する問題