RxHttp 让你眼前一亮的Http请求框架( 七 )

以上使用的皆是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的大致工作流程
RxHttp 让你眼前一亮的Http请求框架

文章插图
 
 
我想应该很好理解,RxHttp要做的事情,就是把添加的参数/请求头等全部丢给Param处理,自己啥事也不敢;随后将Param交给HttpSender,让它去执行请求,执行完毕,返回Response对象;接着又将Response对象丢给Parser去做数据解析工作,并返回实体类对象T;最后,将T通过回调传给开发者,到此,一个请求就处理完成 。
4.2、Param首先,附上一张Param类的继承关系图
RxHttp 让你眼前一亮的Http请求框架

文章插图
 
下面将从上往下对上图中的类做个简单的介绍: