}, throwable -> {
//失败回调
});
可以看到,直接使用fromListParser
操作符,传入Student.class
即可,它内部就是通过ListParser.get(Student.class)
获取的ListParser对象。
接下来我们看看RxHttp提供的最后一个解析器DownloadParser
DownloadParser的作用是将Http返回的输入流写到文件中,即文件下载
这个好理解,就不仔细讲解了,有一点要的说的,此解析器是支持断点下载,我们来看看如何实现断点下载,并且带进度回调
//断点下载,带进度
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个缺点
Data
对象,随后使用map
操作符从Data
拿到Student对象传给下游观察者Data
里面的code字段做验证那么有什么优雅的办法解决呢?答案就是自定义解析器。我们来定一个DataParser解析器,如下:
代码跟SimpleParser类差不多,好处如下
此时,我们就可以如下实现:
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解析器
代码都差不多,就不在讲解了,直接看怎么用:
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最新上万页的大厂面试真题
七大模块学习资料:如NDK模块开发、Android框架体系架构…
只有系统,有方向的学习,才能在段时间内迅速提高自己的技术。
这份体系学习笔记,适应人群:
**第一,**学习知识比较碎片化,没有合理的学习路线与进阶方向。
**第二,**开发几年,不知道如何进阶更进一步,比较迷茫。
**第三,**到了合适的年纪,后续不知道该如何发展,转型管理,还是加强技术研究。如果你有需要,我这里恰好有为什么,不来领取!说不定能改变你现在的状态呢!
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)】免费获取。