0
我試圖找到一種並行執行請求的方法,並在每個observable完成時處理它們。儘管所有的觀察對象都給出了迴應,但所有事情都能正常工作,但在完成所有事情時我沒有辦法處理所有的錯誤。RxAndroid - 使用Zip操作符處理錯誤
這是拉鍊運算符,它基本上並行地執行2名的請求的示例:
Observable.zip(
getObservable1()
.onErrorResumeNext { errorThrowable: Throwable ->
Observable.error(ErrorEntity(Type.ONE, errorThrowable))
}.subscribeOn(Schedulers.io()),
getObservable2()
.onErrorResumeNext { errorThrowable: Throwable ->
Observable.error(ErrorEntity(Type.TWO, errorThrowable))
}.subscribeOn(Schedulers.io()),
BiFunction { value1: String, value2: String ->
[email protected] value1 + value2
})
//execute requests should be on io() thread
.subscribeOn(Schedulers.io())
//there are other tasks inside subscriber that need io() thread
.observeOn(AndroidSchedulers.mainThread())
.subscribe(
{ result ->
Snackbar.make(view, "Replace with your own action " + result, Snackbar.LENGTH_LONG)
.setAction("Action", null).show()
},
{ error ->
Log.d("TAG", "Error is : " + (error as ErrorEntity).error.message)
}
)
private fun getObservable1(): Observable<String> {
return Observable.defer {
throw Throwable("Error 1")
}
}
private fun getObservable2(): Observable<String> {
return Observable.defer {
throw Throwable("Error 2")
}
}
問題的這種方法是,沒有機制來加入用於成功的情況下等雙功能每個錯誤做。因此,zip運算符只會觸發第一個錯誤,並會忽略其他錯誤。
輸出:
D/TAG: Error is : Error 1
有什麼辦法來檢索所有的錯誤後,才觀察到的每一個拉鍊內完成或放棄錯誤?
我的主要目標是查看哪些請求發生了錯誤,並僅在用戶出現對話框時詢問他是否要重試失敗的請求。
如果你沒有繼續在下一個簡歷上發生錯誤,而是使用一個包含錯誤的包裝器對象,這可能會更容易? – masp
這是一個可能的解決方案,謝謝。然而,它並沒有打破onError()onNext()方法的目的? – iGoDa
'有onError()onNext()方法的目的?'這取決於您在系統中定義爲「錯誤」的內容。我同意這篇文章@LordRaydenMK的提及和[這一個](http://blog.danlew.net/2015/12/08/error-handling-in-rxjava/)。如果您的應用/系統不知道如何處理,應該使用「OnError」。每當系統不遵循「快樂之路」時,您不應該拋出異常。 – masp