我目前正试图在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
或a
SocketTimeOutException
这个
onFailure()
不会调用。
我找到的解决这个问题的唯一方法是使用另一个
消费者
处理
Exceptions
在RxJavaPlugins中。
RxJavaPlugins.setErrorHandler(new NetworkErrorConsumer());
网络错误消费者
class NetworkErrorConsumer : Consumer<Throwable> {
override fun accept(exception: Throwable) {
// ...
}
}
问题是,要通知UI有错误,我需要使用事件总线将消息发送回活动。
有没有更好的解决方案
catch
那些
例外情况
在我的
NetworkConsumer
?
我真的希望有一个解决方案,允许我在调用时使用Lambda样式
login
,而不是创建另一个对象。
谢谢