每隔X秒执行一次网络请求,如何暂停/恢复?

时间:2016-02-12 01:25:57

标签: android retrofit rx-java rx-android retrofit2

以前,我使用Runnable Handler,并执行.postDelayed(runnable, delay),延迟3秒,向api发送网络请求,更新坐标地图。我认为这是尝试获取一些Rx的好机会。我切换了Retrofit调用以返回Observable,并使用.interval()运算符来实现重复调用。继承了我目前的代码:

Observable.interval(3000, TimeUnit.MILLISECONDS)
            .flatMap(new Func1<Long, Observable<IssResponse>>() {
                @Override
                public Observable<IssResponse> call(Long aLong) {
                    Log.d("api", "inside the call method: " + aLong.toString());
                    return issService.getLocation();
                }
            }).subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .subscribe(new Subscriber<IssResponse>() {
                @Override
                public void onCompleted() {
                    Log.d("api", "rx comleted");
                }

                @Override
                public void onError(Throwable e) {
                }

                @Override
                public void onNext(IssResponse issResponse) {
                    Log.d("api", "response: " + issResponse.getIssPosition().getLatitude().toString());
                }
            });

这似乎按预期运行,每3秒返回一次结果。现在我想做的是&#34;暂停&#34;然后继续恢复这些请求,就像Android生命周期一样,如果用户切换到不同的片段,我不想继续执行请求,以便地图甚至不可见。

使用HandlerRunnable,我想我可以在handler.removeCallbacks(runnable)方法中调用onPause(),这似乎可以暂停请求。当我决定切换到Rx时,我没有使用HandlerRunnable方法来实现恢复功能。那么如何用Rx实现这个功能呢?我怎么能暂停并稍后使用RxJava恢复请求?

编辑:找到了暂停使用Observable.takeWhile(boolean)并切换布尔值的方法。现在我只需要一种方法来恢复..

1 个答案:

答案 0 :(得分:3)

由于Observable不是hot,我建议您使用其他更简单的方法:只需订阅并取消订阅Observable

Observable / onCreate / fragment的{​​{1}}内activity创建并保存参考:

presenter

private Observable<IssResponse> observable; observable = Observable .interval(3000, TimeUnit.MILLISECONDS) .flatMap(new Func1<Long, Observable<IssResponse>>() { //... }); 订阅并保存对onResume的引用:

Subscription

最后取消订阅private Subscription subscription; subscription = observable.subscribe(result -> { //user your data }); / onPause

onStop

还有RxLifecycle库,我没有使用它,因此我不确定它是否符合subscription.unsubscribe(); 的要求。