以上使用的皆是RxJava的线程调度器,不熟悉的请自行查阅相关资料,这里不做详细介绍 。
3.12.2、指定回调所在线程
指定回调所在线程,依然使用RxJava的线程调度器,如下:
//指定回调所在线程,需要在第二部曲后调用RxHttp.get("/service/...").asString().observeOn(AndroidSchedulers.mainThread()) //指定在主线程回调.subscribe(s -> { //s为String类型,主线程回调//成功回调}, throwable -> {//失败回调});
3.13、 Retrofit用户时常会有童鞋问我,我是Retrofit用户,喜欢把接口写在一个类里,然后可以直接调用,RxHttp如何实现?其实,这个问题压根就不是问题,在介绍第二部曲的时候,我们知道,使用asXxx方法后,就会返回Observable<T>对象,因此,我们就可以这样实现:
public class HttpWrapper {public static Observable<List<Student>> getStudent(int page) {return RxHttp.get("/service/...").add("page", page).asList(Student.class);}}//随后在其它地方就可以直接调用HttpWrapper.getStudent(1).as(RxLife.asOnMain(this))//主线程回调,并在页面销毁自动关闭请求(如果还未关闭的话).subscribe(students -> { //学生列表//成功回调}, throwable -> {//失败回调});
很简单,封装的时候返回Observable<T>对象即可 。
还有的同学问,我们获取列表的接口,页码是和url拼接在一起的,Retrofit可以通过占位符,那RxHttp又如何实现?简单,如下:
public class HttpWrapper {//单个占位符public static Observable<Student> getStudent(int page) {return RxHttp.get("/service/%d/...", page)//使用标准的占位符协议.asObject(Student.class);}//多个占位符public static Observable<Student> getStudent(int page, int count) {return RxHttp.get("/service/%1$d/%2$d/...", page, count)//使用标准的占位符协议.asObject(Student.class);}}
这一点跟Retrofit不同,Retrofit是通过注解指定占位符的,而RxHttp是使用标准的占位符,我们只需要在url中声明占位符,随后在传入url的后面,带上对应的参数即可 。
4、原理剖析4.1、工作流程在RxHttp有4个重要的角色,分别是:
- Param:RxHttp类中所有添加的参数/请求头/文件都交由它处理,它最终目的就是为了构建一个Request对象
- HttpSender :它负责从Param对象中拿到Request对象,从而执行请求,最终返回Response对象
- Parser:它负责将HttpSender返回的Response对象,解析成我们期望的实体类对象,也就是泛型T
- RxHttp:它像一个管家,指挥前面3个角色做事情,当然,它也有自己的事情要做,比如:请求线程的调度,BaseUrl的处理、允许开发者自定义API等等
文章插图
我想应该很好理解,RxHttp要做的事情,就是把添加的参数/请求头等全部丢给Param处理,自己啥事也不敢;随后将Param交给HttpSender,让它去执行请求,执行完毕,返回Response对象;接着又将Response对象丢给Parser去做数据解析工作,并返回实体类对象T;最后,将T通过回调传给开发者,到此,一个请求就处理完成 。
4.2、Param首先,附上一张Param类的继承关系图
文章插图
下面将从上往下对上图中的类做个简单的介绍:
- IHeaders:接口类,里面定义了一系列addHeader方法
- IParam:接口类,里面定义了add(String,Object)、addAll(Map)等方法,
- IRequest:接口类,里面定义了一系列getXxx方法,通过这些方法最终构建一个Request对象
- Param:接口类,是一个空接口,继承了前面3个接口,里面有一系列静态方法可以获取到Param的具体实现类
- AbstractParam:Param接口的抽象实现类,实现了Param接口的所有方法
- IFile:接口类,里面定义了一系列addFile方法
- IUploadLengthLimit:接口类,里面就定义了一个checkLength()方法,用于限制文件上传大小
- NoBodyParam:Param的具体实现类,Get、Head请求就是通过该类去实现的
- JsonParam:Param的具体实现类,调用RxHttp.xxxJson(String)请求方法时,内部就是通过该类去实现的
- JsonArrayParam:Param的具体实现类,调用RxHttp.xxxJsonArray(String)请求方法时,内部就是通过该类去实现的
- FormParam:Param的具体实现类,同时又实现了IFile、IUploadLengthLimit两个接口,调用RxHttp.xxxForm(String)请求方法时,内部就是通过该类去实现的
推荐阅读
- 给你百万年薪,让你担任公司的架构师,你知道该做哪些事吗?
- 治眼疾茶方推荐
- 台灯什么角度最保护眼睛,写作业台灯的正确摆放位置
- 怎样看台灯伤不伤眼睛,台灯闪烁会伤眼睛吗
- 肚脐眼到底能不能抠?抠了会什么样的后果,你知道吗
- 索隆的眼睛怎么回事 索隆的一只眼睛怎么瞎的
- 10款自制减肥茶 让你轻松享瘦
- 阴阳眼可以看见什么 阴阳眼的人能看到什么
- 减辐射护眼睛 每天宜喝四杯茶
- 双眼皮疤痕增生的前兆有哪些