【问题标题】:Android Volley RequestFuture + RxJava2 Observable repeatAndroid Volley RequestFuture + RxJava2 Observable 重复
【发布时间】:2017-10-15 05:28:03
【问题描述】:

MainActivity 中,我想每 5 秒刷新一次工具栏
所以我用 TimerVolley 异步请求实现了它,它就像一个魅力。

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

  1. 我将 Async Volley 请求更改为 RequestFuture
  2. 在 View 中,我使用 repeat() 方法将 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);

【问题讨论】:

    标签: android rx-java


    【解决方案1】:

    运营商repeatWhen 将重复,并且不会重新订阅。为此,您需要一个稍微复杂的构造:

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

    【讨论】:

    • 当我 Dump java heap 时,我发现 LiveRemoteModel() 的实例增加了。我可以做些什么来提高内存性能?
    • 不要重新创建它们,也不要忘记从 doLiveRefresh() 中完成 observable ....
    • 你的意思是 Observable 还是 LiveRemoteModel() ?我在 onResume() 中创建 Observable 所以它创建了一次。但是我怎么能不创建 LiveRemoteModel() ?
    • new LiveRemoteModel().doLiveRefresh2() observable 的生命周期是多少?它完成了吗?它发出多少个项目?
    • 我创建了一个新问题,请继续:link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-09-02
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2017-09-17
    相关资源
    最近更新 更多