【发布时间】:2017-03-17 01:22:29
【问题描述】:
我是 Rxjava 的新手。好复杂……
我需要处理一个复杂的场景,我想知道如何使用 Rxjava 来制作它。
这是关于应用启动的逻辑:
- 应用启动和
splash页面打开 - http reqesut
check_update检查应用是否需要更新。 - 如果应用有新版本必须更新,弹出一个通知对话框,只有一个
update按钮;如果应用有新版本,但不是必须更新,则弹出一个带有 2 个按钮的对话框(update和ignore);如果没有新版本,请继续。 - 不需要更新,所以我们需要跳转到
home页面或login页面,根据当前auth_token状态。 - 从 sharedPreference 中读取
auth_token。然后调用http请求check_auth检查是否有效。如果有效,跳转到home页面;如果没有,请跳转到login页面。
在这个过程中,涉及到 2 个 http 请求和大量的条件检查。 http请求报错也需要处理,这个过程可以写成一个Rxjava吗?
我觉得这样可以,但是不知道对不对。
mRetrofitService.checkUpdate(new CheckUpdateRequest("android", "0.0.1")) // check update request
.compose(RxUtil.applyScheduler()) // scheduler
.flatMap(RxUtil.applyFunction()) // handle the response.
.flatMap((Function<CheckUpdateResponse, ObservableSource<?>>) checkUpdateResponse -> {
int updateMode;
if (checkUpdateResponse.isHas_new_version()) {
if (checkUpdateResponse.isForce_update()) {
updateMode = FORCE_UPDATE; // 1
} else {
updateMode = CHOOSE_UPDATE; // 2
}
} else {
updateMode = NO_UPDATE; // 0
}
return Observable.just(updateMode);
})
.flatMap(o -> {
if (Integer.parseInt(o.toString()) == NO_UPDATE) {
return mRetrofitService.checkAuth();
}
return null; //what should I return for pop up dialog?
})
.flatMap(RxUtil.applyFunction())
.subscribe(new Observer<CheckAuthResponse>() {
@Override
public void onSubscribe(Disposable d) {
}
@Override
public void onNext(CheckAuthResponse checkAuthResponse) {
// valid
gotoHome();
}
@Override
public void onError(Throwable e) {
// should I handle pop here?
// should I handle auth invalid here?
// should I handle checkUpdate request error here?
// should I handle checkAuth here?
// how to distinguish these errors?
}
@Override
public void onComplete() {
}
});
我说的对吗?你能回答我的问题(代码中的cmets)吗?
【问题讨论】:
标签: android retrofit2 rx-java2