2017-02-25 16 views
0

Pollingserviceを実装して、nDelay SecondsごとにREST APIを呼び出し、データが変更された場合はすべてのユーザに通知したいと考えています。データが変更されていなくても、コンシューマーに常に値を返すので、コードに少し問題があります。RXJava2/RXAndroid 2とRetrofitを使用したポーリング

private Observable<List<HueLight>> pollingLightsObservable = null; 

public Observable<List<HueLight>> getPollingLightsObservable() { 
     if (pollingLightsObservable == null) { 
      pollingLightsObservable = Observable.fromCallable(
        () -> LightManager 
          .getInstance(context) 
          .getLights() 
          .blockingSingle()) 
        //  .distinctUntilChanged((l1, l1) -> !l1.equals(l2)) 
          .repeatWhen(o -> o.concatMap(v -> Observable.timer(1, TimeUnit.SECONDS))); 

     } 
     return pollingLightsObservable; 
} 

distinctUntilChangedを有効にするか使用すると何も変更されません。私はそれを私の繰り返しの前後に置いても問題ありません。

私のRetroFit CallはObservableを返すので、blockingSingle()を使用する必要があります。観測を使用すると、直接それは、このサンプルで "4、8、12、16、.." のアイテムの復帰につながる:/

LightManager.getInstance(context).getLights() 
          .repeatWhen(o -> o.concatMap(v -> Observable.timer(1, TimeUnit.SECONDS))) 

は現在、私は、異なるクラスから購読してのactivites

this.lightChangeSubscriber = PollingManager 
       .getInstance(getContext()) 
       .getPollingLightsObservable() 
       .subscribeOn(Schedulers.newThread()) 
       .observeOn(AndroidSchedulers.mainThread()) 
       .subscribe(hueLights -> { 
        { 
         Log.d(TAG, "Lights received successfully! Size=" + hueLights.size()); 
        } 
       }); 

私は素敵なインターフェイスとタイマーを使用してポーリングを作成することを避けるだろう。あなたは何をお勧めします ?

+0

https://github.com/kaushikgopal/RxJava-Android-Samples – eurosecom

答えて

0

カスタムフィルタを使用するとどうなりますか?

public class FilterDuplicateHueConfig implements Predicate<HueConfig> { 

    private HueConfig lastVal; 
    @Override 
    public boolean test(HueConfig newVal) { 
     if(lastVal == null) { 
     lastVal = newVal; 
     return true; 
     } 
     ... compare here the two values and return true/false appropriately... 
    } 
} 
+0

でAndroid向けの学習RxJavaを読み取ろうと私の「加入者」は、間違ったクラスからコピーされていないされて以来、私はちょうど私のコードを変更しHVE valid ;-)しかし、フィルタを使用すると、distinctUntilChangedのように同じことが行われます。私は、問題が存在すると思う場合は、distinctUntilChangedで比較する2つのリストは常に真である場合は、サイズが同じですか? –

関連する問題