gpt4 book ai didi

android - RxJava - 捕捉消费者异常

转载 作者:行者123 更新时间:2023-11-30 00:03:55 25 4
gpt4 key购买 nike

我目前正在尝试为我的 Android 应用程序中的网络处理找到更好的解决方案。目前,我正在使用 RxJava 和一些 Consumer 类。

消费者

public interface Consumer<T> {
/**
* Consume the given value.
* @param t the value
* @throws Exception on error
*/
void accept(T t) throws Exception;
}

网络消费者

abstract class NetworkConsumer<T> : Consumer<NetworkResponse<T>> {

override fun accept(response: NetworkResponse<T>) {
if (response.isSuccessful()) {
onSuccess(response.data)
} else {
onFailure()
}
}

// other functions such as onSuccess and onFailure
}

使用网络消费者

UserService.login(email, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : NetworkConsumer<LoginResponse>() {
override fun onSuccess(response: LoginResponse) {
super.onSuccess(response)
startMainActivity()
}

override fun onFailure() {
Toast.makeText(this@LoginActivity, "Could not login.", Toast.SHORT_LENGTH).show()
}

})

现在,这在大多数正常情况下都能正常工作,例如成功登录或 404 错误。但是,如果出现 Exception,例如 HttpExceptionSocketTimeOutExceptiononFailure() 将不会被调用。

对于这个问题,我找到的唯一解决方案是使用另一个 Consumer 来处理 RxJavaPlugins 中的 Exceptions

RxJavaPlugins.setErrorHandler(new NetworkErrorConsumer());

网络错误消费者

class NetworkErrorConsumer : Consumer<Throwable> {
override fun accept(exception: Throwable) {
// ...
}
}

问题是要通知 UI 出现错误,我需要使用事件总线将消息发送回 Activity。

是否有更好的解决方案可以让我在 NetworkConsumer捕获那些异常

我非常想要一个解决方案,它允许我在调用 login 时使用 Lambda 样式,而不是创建另一个对象。

谢谢!

最佳答案

subscribe() 方法有一个版本接受一个Observer,你可以创建一个带有基本异常处理的基本方法:

abstract class NetworkObserver<T> : Observer<NetworkResponse<T>> {

override fun onError(exception: Throwable) {
//your base exception handling
}

override fun onNext(response: NetworkResponse<T>) {
if (response.isSuccessful()) {
onSuccess(response.data)
} else {
onFailure()
}
}

override fun onComplete() {}

override fun onSubscribe(d: Disposable) {}

//onSucess & onFailure functions

}

然后将此类的实现用于您的登录逻辑:

UserService.login(email, password)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(object : NetworkObserver<LoginResponse>() {
override fun onNext(response: LoginResponse) {
super.onNext(response)
//additional logic
}

override fun onSuccess(response: LoginResponse) {
super.onSuccess(response)
startMainActivity()
}

override fun onFailure() {
Toast.makeText(this@LoginActivity, "Could not login.", Toast.SHORT_LENGTH).show()
}

//you can override onError() method if
//you need additional exception handling logic
})

但是使用这种方法你将无法使用 Lamda 风格

关于android - RxJava - 捕捉消费者异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49373097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com