Android Volley RequestFuture + RxJava2 Observable repeat

时间:2017-05-16 08:31:25

标签: android rx-java

MainActivity 中,我想每5秒刷新工具栏
所以我用计时器& 排球异步请求,它就像一个魅力。

现在我更喜欢用 RxJava2 替换Timer 因此我做了这些步骤:

  1. 我将Async Volley请求更改为 RequestFuture
  2. 在View中,我使用repeat()方法
  3. 将Timer更改为Observable

    但我的问题是: 每次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);
    

1 个答案:

答案 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())
            ;