在我的Android
項目中,我做了很多網絡請求(使用Retrofit
和RxJava
),它們返回響應的自定義超類型,它可以包含有效或錯誤響應。RxJava通用方法來檢查用戶中的錯誤消息
AppResponse {
error=AppError {
code=12345,
message='null'
},
data=null
}
的錯誤碼是沒有HTTP錯誤代碼,但是內容從與SimpleXML
解析XML
結果檢索。大約有4-5個錯誤代碼對於所有網絡請求都是相同的,例如會話超時等等。因此,我會編寫一個通用方法來檢查這些錯誤代碼的所有響應,並設置對策,例如請求新會話。
首先,我想到了使用OkHttp
攔截器,但因爲我需要將我的結果解析爲適當的格式,所以我無法使用它。 解析結果後我使用RxJava
,目前我正在檢查我的結果在訂閱方法中的響應。
restClient.requestHostList()
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Subscriber<HostListResponse>() {
@Override
public void onError() {
}
@Override
public void onCompleted() {
}
@Override
public void onNext(HostListResponse hostListResponse) {
if (hostListResponse.isError()) {
if(hostListResponse.getError().getCode() == 12345) {
requestNewSession();
} else if(hostListResponse.getError().getCode() == 23456) {
requestNewLogin();
}
else {
//do some UI stuff here
}
我不知道怎麼這裏着手,有沒有類似的東西可以在到達之前使用訂閱驗證結果,也許開始另一個網絡請求,或者倒不如啓動這個Transformer
訂戶?我也在想,如果onErrorResumeNext()是通過將可觀測拋出一個錯誤的選擇,當未通過結果測試代碼,像這樣:
restClient.requestHostList()
.subscribeOn(Schedulers.io())
.unsubscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.flatMap(new Func1<HostListResponse, Observable<Throwable>>() {
@Override
public Observable<Throwable> call(HostListResponse hostListResponse) {
if (hostListResponse.isError()) {
if(hostListResponse.getError().getCode() == 12345) {
throw new Exception();
}
}
}
})
.onErrorResumeNext(new Func1<Throwable, Observable<? extends Throwable>>() {
//do error handling here
})
謝謝您的回覆,我會立刻嘗試:) – Eve