2017-02-25 75 views
0

我想實現一個Pollingservice,每nDelay秒調用一個REST Api,並通知所有訂戶數據是否已更改。現在,我的代碼出現了一些小問題,因爲它始終向我的消費者返回值,即使數據未更改。使用RXJava2/RXAndroid 2輪詢和改造

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調用返回一個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

閱讀學習RxJava爲Android HVE我只是修改我的代碼,因爲我的「用戶」,從錯誤的類被複制,而不是有效;-)但是,使用過濾器應該像distinctUntilChanged一樣。我認爲有一個問題比較在distinctUntilChanged,因爲如果大小相同,比較兩個列表總是正確的? –