以前,我使用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生命周期一样,如果用户切换到不同的片段,我不想继续执行请求,以便地图甚至不可见。
使用Handler
和Runnable
,我想我可以在handler.removeCallbacks(runnable)
方法中调用onPause()
,这似乎可以暂停请求。当我决定切换到Rx时,我没有使用Handler
和Runnable
方法来实现恢复功能。那么如何用Rx实现这个功能呢?我怎么能暂停并稍后使用RxJava恢复请求?
编辑:找到了暂停使用Observable.takeWhile(boolean)
并切换布尔值的方法。现在我只需要一种方法来恢复..
答案 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();
的要求。