Android Rxjava2-多重改装请求和处理所有异常
我是Rxjava新手。太复杂了 我需要处理一个复杂的场景,我想知道如何使用Rxjava实现它 这是关于应用程序启动的逻辑:Android Rxjava2-多重改装请求和处理所有异常,android,retrofit2,rx-java2,Android,Retrofit2,Rx Java2,我是Rxjava新手。太复杂了 我需要处理一个复杂的场景,我想知道如何使用Rxjava实现它 这是关于应用程序启动的逻辑: 应用程序启动并启动splash页面打开 使http请求检查\u update以检查应用程序是否需要更新 如果应用程序有新版本并且必须更新,则弹出一个通知对话框,其中只有一个更新按钮;如果应用程序有新版本,但不必更新,则弹出一个带有2个按钮的对话框(update和ignore);如果没有新版本,请下一步 无需更新,因此我们需要根据当前的auth_令牌状态跳转到home页面或l
splash
页面打开检查\u update
以检查应用程序是否需要更新更新按钮;如果应用程序有新版本,但不必更新,则弹出一个带有2个按钮的对话框(update
和ignore
);如果没有新版本,请下一步
auth_令牌
状态跳转到home
页面或login
页面李>
check\u auth
检查它是否有效。如果有效,跳转到主页
页面;如果没有,请跳转到登录
页面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() {
}
});
mRetrofitService.checkUpdate(新的CheckUpdateRequest(“android”,“0.0.1”)//检查更新请求
.compose(RxUtil.applyScheduler())//调度程序
.flatMap(RxUtil.applyFunction())//处理响应。
.flatMap((函数)根据文档“通知观察者被观察对象遇到错误情况”。因此此回调与处理请求错误无关
我建议您使用改装类来处理不同的情况
例如,您可以这样定义您的服务:
@method(url)
Call<CheckAuthResponse> checkUpdate(...);
@方法(url)
调用checkUpdate(…);
在您的rx工作流程中:
mRetrofitService.checkUpdate(new CheckUpdateRequest("android", "0.0.1")) // check update request
.compose(RxUtil.applyScheduler()) // scheduler
.flatMap(RxUtil.applyFunction()) // handle the response.
.map((Function<Response<CheckUpdateResponse>, CheckUpdateResponse>) retrofitResponse -> {
if ( retrofitResponce.code() == authInvalidCode ) {
//do something
} else if (...) {
}
return retrofitResponse.body()
})
.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() {
}
});
mRetrofitService.checkUpdate(新的CheckUpdateRequest(“android”,“0.0.1”)//检查更新请求
.compose(RxUtil.applyScheduler())//调度程序
.flatMap(RxUtil.applyFunction())//处理响应。
.map((功能)响应->{
if(reformationResponse.code()==authInvalidCode){
//做点什么
}否则如果(…){
}
返回response.body()
})
.flatMap((函数`if(reformationResponse.code()==authInvalidCode){//do something}`在schedule.io中运行,因此如果我想展示一个toast,似乎我无法在这里完成。您可以在映射函数observeOn(Androidscheduler.mainThread())之前添加一个add observeOn(relevantScheduler)如果要在另一个线程中执行下一个操作,请在之后执行。