我是Rxjava的新手。它太复杂了......
我需要处理一个复杂的场景,我想知道如何使用Rxjava。
这是关于应用启动的逻辑:
splash
页面打开check_update
以检查应用是否需要更新。update
按钮的通知对话框;如果应用有新版本但不必更新,则弹出一个包含2个按钮的对话框(update
和ignore
);如果没有新版本,请转到下一步。home
状态跳转到login
页面或auth_token
页面。 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() {
}
});
我是对的吗?你能否回答我的问题(代码中的评论)?
答案 0 :(得分:0)
根据文档onError“通知观察者Observable遇到了错误情况。”因此,此回调与处理请求错误无关。
我建议您使用Response类改造来处理不同的情况。
例如,您可以像这样定义您的服务:
@method(url)
Call<CheckAuthResponse> 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() {
}
});
希望这会有所帮助;
抱歉我的英文。