在 MainActivity 中,我想每5秒刷新工具栏。
所以我用计时器& 排球异步请求,它就像一个魅力。
现在我更喜欢用 RxJava2 替换Timer 因此我做了这些步骤:
但我的问题是: 每次RX重复发射的数据与第一次相同。 为什么?
public Observable<String> doLiveRefresh2() {
RequestFuture<String> future = RequestFuture.newFuture();
VolleyStringRequest request = new VolleyStringRequest(Request.Method.POST
, REFRESH_URL
, future
, future) {
@Override
protected Map<String, String> getParams() throws AuthFailureError {
return getRefreshParams();
}
};
VolleySingleton.getInstance().addToRequestQueue(request);
return Observable.fromFuture(future, Constants.VOLLEY_SECONDS_TIME_OUT, TimeUnit.SECONDS, Schedulers.io());
}
final CompositeDisposable disposables = new CompositeDisposable();
Observable<LiveResponse> observable = new LiveRemoteModel().doLiveRefresh2()
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.repeatWhen(completed -> completed.delay(Constants.TOOLBAR_BADGES_REFRESH_DELAY, TimeUnit.SECONDS))
.map(LiveResponse::new)
;
DisposableObserver<LiveResponse> disposableObserver =
new DisposableObserver<LiveResponse>() {
@Override
public void onNext(@NonNull LiveResponse liveResponse) {
setToolbarBadges(liveResponse.getToolbarBadges());
}
public void onError(@NonNull Throwable e) {
Log.e("RX", "onError: ", e);
}
@Override
public void onComplete() {
Log.d("RX", "onComplete: ");
}
};
Disposable disposable = observable.subscribeWith(disposableObserver);
disposables.add(disposable);
答案 0 :(得分:0)
The operator repeatWhen
will repeat the values, and will not resubscribe. For that you need a slightly more complex construct:
Observable<LiveResponse> observable = Observable
.interval(Constants.TOOLBAR_BADGES_REFRESH_DELAY, TimeUnit.SECONDS))
.subscribeOn(Schedulers.io())
.flatMap(dummy -> new LiveRemoteModel().doLiveRefresh2())
.map(LiveResponse::new)
.observeOn(AndroidSchedulers.mainThread())
;