Rxjavaを初めて使用しています。それは非常に複雑です......Rxjava2 - マルチレトロフィット要求とすべての例外処理
私は複雑なシナリオを扱う必要があります、私はRxjavaを使ってそれを作る方法を知りたいです。
それはアプリの開始に関するロジックです:
- アプリの開始と
splash
ページは、アプリがアップデートする必要があれば、HTTP reqesutcheck_update
チェックすることにします。 - 新しいバージョンがあり、更新が必要な場合は、
update
ボタンを1つだけ使用して通知ダイアログをポップアップします。もしアプリケーションが新しいバージョンを持っていて、更新する必要がなければ、2つのボタン(update
とignore
)でダイアログをポップアップします。新しいバージョンがない場合は、次に進みます。 - 更新する必要はありませんので、現在は
auth_token
の状態に従ってhome
ページまたはlogin
ページにジャンプする必要があります。 auth_token
からsharedPreferenceを読み取ります。 http要求check_auth
を呼び出して、有効かどうかを確認します。有効な場合は、home
ページにジャンプしてください。そうでない場合は、login
ページにジャンプしてください。
このプロセスでは、2つのHTTPリクエストと多数の条件チェックが行われます。 httpリクエストエラーも処理する必要があります。このプロセスを1つで記述できますか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() {
}
});
私はそうですか?そして私の質問に答えてください(コードのコメント)?
'場合(retrofitResponce.code()== authInvalidCode){ //何かを }' 私はトーストを表示する場合、私がここでそれを作ることができないようですので、それは、schedule.ioで実行されます。 – Leon
マップ関数observeOn(Androidscheduler.mainThread())の前に、別のスレッドで次の操作をしたい場合は、observeOn(relevantScheduler)を追加してから追加できます。 – Cochi