【发布时间】:2018-03-19 22:03:21
【问题描述】:
我目前正在尝试在我的 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
}
使用 NetworkConsumer
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,例如HttpException 或SocketTimeOutException,则不会调用onFailure()。
我为这个问题找到的唯一解决方案是在 RxJavaPlugins 中使用另一个处理 Exceptions 的 Consumer。
RxJavaPlugins.setErrorHandler(new NetworkErrorConsumer());
NetworkErrorConsumer
class NetworkErrorConsumer : Consumer<Throwable> {
override fun accept(exception: Throwable) {
// ...
}
}
这样做的问题是,为了通知 UI 有错误,我需要使用事件总线将消息发送回 Activity。
有没有更好的解决方案让我的catch 那些Exceptions 在我的NetworkConsumer 中?
我真的很想要一个解决方案,它允许我在调用login 时使用 Lambda 样式,而不是创建另一个对象。
谢谢!
【问题讨论】:
-
为什么你不将这个
NetworkErrorConsumer作为subscribe()方法的第二个参数传递?这应该捕获发生的任何异常。你可以把它作为Lamda表达式传递 -
NetworkErrorConsumer是个好主意,但我不想将它传递给每个网络调用。有什么方法可以将所有网络错误路由到同一个位置?另外,我不能做一个 Lambda 表达式,我只能用object: NetworkErrorConsumer语法来做。我正在尝试为此编写扩展函数,但我无法获得正确的语法。 -
检查我的答案...
标签: android lambda rx-java rx-android