发生错误时如何获得另一个可观察到的响应?

时间:2018-10-17 11:21:28

标签: android kotlin retrofit observable

我只想问一问另一个可观察到的错误后是否有可能得到另一个可观察到的响应?

例如,我使用combineLatest调用两个api头像和附件。

val avatar: Observable<ResponseBody> = api().getAvatar()
val attachment: Observable<ResponseBody> = api().getAttachment()

val obs = Observables.combineLatest(avatar, attachment)
        .map { it ->
            if (it.first is Exception) {
                Log.e(TAG, "getAvatar failed")
            } else {
                updateAvatar()
            }
            if (it.second is Exception) {
                Log.e(TAG, "getAttachment failed")
            } else {
                updateAttachment()
            }

            if (it.first !is Exception && it.second !is Exception) {
                Log.i(TAG, "success first=${it.first}, second=${it.second}")
                updateAll()
            }

        }
        .subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .onErrorReturn { it }
        .subscribe()
disposable.add(obs)

如果附件错误,我只想获取头像响应,如果头像错误,我只想获取附件响应。

谢谢。

1 个答案:

答案 0 :(得分:1)

是的,我的朋友。您可以通过调用onErrorReturn()方法来处理合并的每个可观察对象的错误。您可以使用空的ResponseBody来检测错误。最终代码

val avatar: Observable<Optional<ResponseBody>> = api().getAvatar().onErrorReturn{ Optional.empty }
val attachment: Observable<Optional<ResponseBody>> = api().getAttachment().onErrorReturn{ Optional.empty }

val obs = Observables.combineLatest(avatar, attachment) {avatar, attachment -> 
        if (!avatar.isPresent()) {
            //logic
        }
        if (!attachment.isPresent()) {
            //logic
        }
    }.subscribeOn(Schedulers.io())
     .observeOn(AndroidSchedulers.mainThread())
     .onErrorReturn { it }
     .subscribe()

如果您在项目中使用Java 7或更低版​​本,则可以编写自己的Optional

class Optional<T>(val value: T?) {
        companion object {
            fun <T> empty(): Optional<T> = Optional(null)
        }

        fun isPresent() = value != null
    }