RxJava
配合Retrofit
能够大大简化Android项目中的网络请求代码量,使得逻辑更清晰,当然也可能会遇到一些问题。下面给出一种问题的解决方案。
需求
一个基本的RxJava配合Retrofit以及Lambda的网络调用看起来像这个样子的:
1 |
|
当Retrofit
中的网络请求返回码状态码为200
时,执行do Something
中的逻辑处理正常的
业务流程,但是当服务器返回状态码为非200
时,将会执行Ops Error
中的业务流程而不会
执行do Something
中的业务逻辑。
这样本没有什么问题,一般我们会在错误处理逻辑中在UI中给出错误提示,像这样:
1 | Log.e("Ops", "Error:" + throwable.getMessage()); |
但是这样的话我们只能获取到一服务器的错误响应码以及对应的简短的响应码错误说明,一般情况下我们服务器
都会包装错误信息为一个JSON,客户端解析错误信息必要的时候动态展示在UI上以提示用户。如果我们要拿到这样的JSON,使用throwable.getMessage()
这样做显然是不行的。是不是使用RxJava配合Retrofit只能拿到这样的错误Throwable信息呢?
显然不是的,其实服务器返回的错误信息非200
响应码的Response Body
JSON对象包含在这个throwable
对象中,我们可以这样将其解析出来:
1 | throwable -> { |
在Parse to JSON Obj
中将errorBody
解析为JSON对象进行相应的处理即可。
然而,你不能让我每个地方都加上这样的一段代码吧,既然我们使用的是RxJava
,我们可以让这种处理稍微看起来优雅点。以下以Jackson
为例:
自定义Action1
由于RxJava
的错误异常处理接受一个参数,并且没有返回值,因此我们可以定义一个Action1
来替代默认的Error Action:
1 | public abstract class ErrorAction implements Action1<Throwable> { |
其中ErrorMessage
为我们定义好的错误消息Model:
定义Throwable Handle
1 | true) public class ResponseError { (ignoreUnknown = |
这样,我们就完成了一个自定义Action1
了,接下来我们便可以这样使用了:
1 |
|
其中在Do Error
中拿到ErrorMessage
对象,进行相应的对象操作即可~
Enjoy IT!