我有一个每10秒钟重复一次的网络通话。当应用程序最小化时,如何停止呼叫?
注意:这是带有RxJava和Retrofit的MVP。
注意:嵌套调用是为了防止第一次调用花费10秒钟。
注意:这是单一的,而不是可观察的。
dataManager.getAnimalsList() <-----------------call #1
.doOnSuccess(coins -> dataManager
.getAnimalsList() <-----------------call #2
.delay(10, TimeUnit.SECONDS).repeat()
.compose(SchedulerUtils.ioToMain())
.subscribe(
coinItems -> {
getView().showProgress(false);
getView().showCoinList(coinItems);
},
throwable -> {
getView().showProgress(false);
getView().showError(throwable);
}))
.compose(SchedulerUtils.ioToMain())
.subscribe(
coinItems -> {
getView().showProgress(false);
getView().showCoinList(coinItems);
},
throwable -> {
getView().showProgress(false);
getView().showError(throwable);
});
答案 0 :(得分:1)
我不会做嵌套订阅,我认为不推荐。
我会围绕Observable.interval()
构建我的代码并跟踪应用程序状态,如果要停止刷新列表,只需确保isApplicationVisible()
返回正确的布尔值。
Observable.interval(10, TimeUnit.SECONDS)
.filter(__ -> isApplicationVisible())
.flatMapSingle(__ -> dataManager.getAnimalsList())
.subscribe(animalList -> {
System.out.println(Arrays.toString(animalList.toArray()));
// do whatever
});
使用您的代码就像
Observable.interval(10, TimeUnit.SECONDS)
.filter(__ -> isApplicationVisible())
.flatMapSingle(__ -> dataManager.getAnimalsList())
.compose(SchedulerUtils.ioToMain())
.subscribe(coinItems -> {
getView().showProgress(false);
getView().showCoinList(coinItems);
},
throwable -> {
getView().showProgress(false);
getView().showError(throwable);
});
答案 1 :(得分:0)
使用活动/片段生命周期来跟踪api调用。使用filter方法设置布尔标志。您可以使用一次性observable来帮助您在生命周期中处理呼叫。 Read this blog