我想實現一個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());
}
});
我會避免使用接口和計時器來創建輪詢。你會推薦什麼 ?
嘗試通過https://github.com/kaushikgopal/RxJava-Android-Samples – eurosecom