RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器

}, throwable -> {
//失败回调
});

可以看到,直接使用fromListParser操作符,传入Student.class即可,它内部就是通过ListParser.get(Student.class)获取的ListParser对象。

接下来我们看看RxHttp提供的最后一个解析器DownloadParser

DownloadParser

DownloadParser的作用是将Http返回的输入流写到文件中,即文件下载

RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器_第1张图片

这个好理解,就不仔细讲解了,有一点要的说的,此解析器是支持断点下载,我们来看看如何实现断点下载,并且带进度回调

//断点下载,带进度
public void breakpointDownloadAndProgress() {
String destPath = getExternalCacheDir() + “/” + “Miaobo.apk”;
long length = new File(destPath).length();
RxHttp.get(“http://update.9158.com/miaolive/Miaolive.apk”)
.setRangeHeader(length) //设置开始下载位置,结束位置默认为文件末尾
.downloadProgress(destPath,length) //如果需要衔接上次的下载进度,则需要传入上次已下载的字节数
.observeOn(AndroidSchedulers.mainThread()) //主线程回调
.doOnNext(progress -> {
//下载进度回调,0-100,仅在进度有更新时才会回调
int currentProgress = progress.getProgress(); //当前进度 0-100
long currentSize = progress.getCurrentSize(); //当前已下载的字节大小
long totalSize = progress.getTotalSize(); //要下载的总字节大小
})
.filter(Progress::isCompleted)//过滤事件,下载完成,才继续往下走
.map(Progress::getResult) //到这,说明下载完成,拿到Http返回结果并继续往下走
.as(RxLife.asOnMain(this)) //加入感知生命周期的观察者
.subscribe(s -> { //s为String类型
//下载成功,处理相关逻辑
}, throwable -> {
//下载失败,处理相关逻辑
});
}

跟带进度回调的下载代码差不多,上面也有注释,就不在讲解了。

自定义解析器

在上面的介绍的3个解析中,SimpleParser可以说是万能的,任何数据结构,只要你建好对应的Bean类,都能够正确解析,就是要我们去建n个Bean类,甚至这些Bean类,可能很多都是可以抽象化的。例如,大部分Http返回的数据结构都可以抽象成下面的Bean类

public class Data {
private int code;
private String msg;
private T data;
//这里省略get、set方法
}

假设,Data里面的T是一个学生对象,我们要拿到此学生信息,就可以这么做

RxHttp.get(http://www…) //这里get,代表Get请求
.from(new SimpleParser() {}) //这里泛型传入Data
.observeOn(AndroidSchedulers.mainThread()) //主线程回调
.map(Data::getData) //通过map操作符获取Data里面的data字段
.as(RxLife.asOnMain(this))
.subscribe(student -> {
//这里的student,即Data里面的data字段内容
}, throwable -> {
//Http请求出现异常
});

以上代码有3个缺点

  • 还是通过SimpleParse匿名内部类实现的,前面说过,这种方式有可能造成内存泄漏,而且写法上不是很优雅
  • 下游首先拿到的是一个Data对象,随后使用map操作符从Data拿到Student对象传给下游观察者
  • 没法统一对Data里面的code字段做验证

DataParser

那么有什么优雅的办法解决呢?答案就是自定义解析器。我们来定一个DataParser解析器,如下:

RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器_第2张图片

代码跟SimpleParser类差不多,好处如下

  • DataParser自动为我们做了一层过滤,我们可以直接拿到T对象,而不再使用map操作符了
  • 内部可以对code字段做统一判断,根据不同的code,抛出不同的异常,做到统一的错误处理机制(这里抛出的异常会被下游的onError观察者接收)
  • 当codo正确时,就代表了数据正确,下游的onNext观察者就能收到事件
  • 避免了使用匿名内部类

此时,我们就可以如下实现:

RxHttp.get(“http://www…”) //这里get,代表Get请求
.fromDataParser(Student.class) //此方法是通过注解生成的
.as(RxLife.asOnMain(this))
.subscribe(student -> {
//这里的student,即Data里面的data字段内容
}, throwable -> {
//Http请求出现异常
String msg = throwable.getMessage(); //Data里面的msg字段或者其他异常信息
String code = throwable.getLocalizedMessage(); //Data里面的code字段,如果有传入的话
});

注:我们在定义DataParser时,使用了注解@Parser(name = "DataParser"),故在RxHttp类里有fromDataParser方法。

然后,如果Data里面T是一个List又该怎么办呢?我们也许可以这样:

RxHttp.get(“http://www…”) //这里get,代表Get请求
.from(new DataParser() {})
.as(RxLife.asOnMain(this))
.subscribe(students -> {
//这里的students,为List对象
}, throwable -> {
//Http请求出现异常
String msg = throwable.getMessage(); //Data里面的msg字段或者其他异常信息
String code = throwable.getLocalizedMessage(); //Data里面的code字段,如果有传入的话
});

又是通过匿名内部类实现的,心累,有没有更优雅的方式?有,还是自定义解析器,我们来定义一个DataListParser解析器

DataListParser

RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器_第3张图片

代码都差不多,就不在讲解了,直接看怎么用:

RxHttp.get(“http://www…”) //这里get,代表Get请求
.fromDataListParser(Student.class) //此方法是通过注解生成的
.as(RxLife.asOnMain(this))
.subscribe(students -> {
//这里的students,为List对象
}, throwable -> {
//Http请求出现异常
String msg = throwable.getMessage(); //Data里面的msg字段或者其他异常信息
String code = throwable.getLocalizedMessage(); //Data里面的code字段,如果有传入的话
});

注: fromDataListParser方法也是通过注解生成的 我们最后来看一个问题

{
“code”: 0,
“msg”: “”,
“data”: {
“totalPage”: 0,
“list”: []
}
}

这种数据,我们又该如何解析呢?首先,我们再定一个Bean类叫PageList,如下:

public class PageList {
private int totalPage;
private List list;
//省略get/set方法
}

此Bean类,对于的是data字段的数据结构,机智的你肯定马上想到了用DataParser如何实现,如下:

RxHttp.get(“http://www…”) //这里get,代表Get请求
.from(new DataParser(){})
.as(RxLife.asOnMain(this))
.subscribe(pageList -> {
//这里的pageList,即为PageList类型

学习分享

在当下这个信息共享的时代,很多资源都可以在网络上找到,只取决于你愿不愿意找或是找的方法对不对了

很多朋友不是没有资料,大多都是有几十上百个G,但是杂乱无章,不知道怎么看从哪看起,甚至是看后就忘

如果大家觉得自己在网上找的资料非常杂乱、不成体系的话,我也分享一套给大家,比较系统,我平常自己也会经常研读。

2021最新上万页的大厂面试真题

RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器_第4张图片

七大模块学习资料:如NDK模块开发、Android框架体系架构…

RxHttp-一条链发送请求之强大的数据解析功能(二),kotlin构造器_第5张图片

只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。

这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!

由于文章内容比较多,篇幅不允许,部分未展示内容以截图方式展示 。如有需要获取完整的资料文档的朋友点击我的【GitHub】免费获取。

s://github.com/a120464/Android-P7/blob/master/Android%E5%BC%80%E5%8F%91%E4%B8%8D%E4%BC%9A%E8%BF%99%E4%BA%9B%EF%BC%9F%E5%A6%82%E4%BD%95%E9%9D%A2%E8%AF%95%E6%8B%BF%E9%AB%98%E8%96%AA%EF%BC%81.md)】免费获取。

你可能感兴趣的:(程序员,架构,移动开发,android)