Retrofit和Rxjava的优势和区别
Retrofit
定义:它是一个基于Ok的网络请求框架。
优势:
1、使用更方便,
2、相对于Ok来说网络请求过程更加解耦,通过注解和动态代理的方式将请求体和请求过程分离。
3、并且还处理了Ok在使用过程中一些问题。回调结果的处理和对象映射(也就是实体类映射)的处理
4、通过提供的工厂方法工具实现实体类的映射,提供配置三方工厂的一些操作。
Retrofit使用注意:
1、注意注解的搭配使用,BaseUrl()必须以“/”结尾,注解:@GET,@POST等使用过程中注意事项
2、实体类映射时,如果字符串
Retrofit2.6之前和Retrofit2.6之后区别:
2.6之后支持了kotlin的协程
Retrofit注解:
@Query
用于拼接Url路径后面的查询参数,一个@Query相当于拼接一个参数,多个参数中间用,隔开。
@QueryMap
主要的效果等同于多个@Query参数拼接,参数以map的形式传入,以Map的键值对为参数传入,只用于GET请求(@Query, @QueryMap)
@Field 用法类似于@Query 但只用于POST请求
@FieldMap
和QueryMap用法一样以Map形式传入键值对拼接请求参数
只用于POST请求,必须添加@FormUrlEncoded要不然会报异常(@Field, @FieldMap)
@FormUrlEncoded
表示这个请求为表单请求,如果在使用POST请求时不添加这行会报异常
Java.lang.IllegalArgumentException: @Field parameters can only be used with form encoding.
@Path
用于替换Url路径中的变量字符。可以使用在Url里添加{page} 然后在参数里@Path("page") 类型 参数名 声明这个page是一个拼接参数,注意使用@Path时,path对应的路径不能包含”/”,不然每个加到host Url后面的东西都会被省略掉
@Url
@Url是动态的Url请求数据的注解
@Multipart
标记这个请求用于文件传输,可以用@Part("字段名") Multipart.Part 参数名 来传入文件参数,也可以用 RequestBody来传文件
@Streaming
标记说明要把请求的返回数据转换为IO数据流 在文件下载时使用
@Headers/Header
@Headers传入多个头信息以{}来括住头信息 以,号隔开
@Header 传入单个头信息 以"键:值"的形式传入
Rxjava:
定义:Rxjava只是一个异步链式调用的库,不是网络请求!!!Rxjava是一种扩展的观察者模式,整个模式中有4个角色:
1.被观察者(Observable),用来产生事件。观察者(Observer),用来接收事件,并给出响应动作。订阅(Subscribe),用来连接被观察者和观察者。事件(Event),作为被观察者和观察者沟通的载体。
2.Rxjava的执行流程:被观察者(Observable)通过订阅(Subscribe)按顺序发送事件给观察者(Observer),观察者(Observer)按顺序接收事件和作出对应的响应。
3.Rxjava的基本实现:
1. 创建Observable,它决定什么时候触发事件以及触发怎样的事件。
2. 创建Observer,Observer,它决定事件触发的时候将有怎样的行为。还可以用Subscriber代替。
3.Subscribe,用 subscribe() 方法将被观察者和观察者连接
4.线程调度-scheduler
RxJava 通过它来指定被观察者和观察者所在的线程。包括:
Schedulers.immediate(): 直接在当前线程运行,默认
Schedulers.newThread(): 启用新线程执行操作。
Schedulers.io(): I/O 操作(读写文件、读写数据库、网络信息交互等)
Schedulers.computation(): 计算所使用的 Scheduler。
AndroidSchedulers.mainThread(),在 Android 主线程运行。
使用 subscribeOn()指定被观察者所在线程,observeOn() 指定观察者所在线程
5.变换
RxJava 支持将事件序列中的对象或整个序列进行加工处理,转换成不同的事件或事件序列。
Rxjava好处:
1、让复杂的异步处理逻辑更加清晰,因为它是异步链式调用的。它需要结合操作符来做。
2、整体遵循观察者设计模式。
3、切换线程更加方便。
4、他可以配置Retrofit来使用。为什么他可以搭配Retrofit来使用?
Retrofit和Rxjavadapei使用是因为Rxjava本身并不是为了切换线程,Rxjava具备了切换线程的功能,对网络请求的而结果来进行链式操作,通过操作符来处理异步的结果,比如说操作符FiledMap,Map
5、具备了一个工具类的操作,具备了过滤,定时等操作。
原理:如何采用观察者实现这个效果的以及它如何完成线程切换操作?
Rxjava缺点:
订阅完了必须得取消订阅,否则会出现内存泄漏。解决方案:
Rxjava操作符:
concat操作符
Concat先读取缓存数据并展示UI再获取网络数据刷新UI。
1、concat 实现不交错的发射两个甚至多个Observable
2、只有前一个 Observable 终止(onComplete)才会订阅下一个 Observable,
3、多个Observable的泛型应当保持一致
map操作符
可以将Observable操作的数据类型进行转换,传入的参数为Function类型。
1.map回调中,拿到传进来的数据,进行随意转换后继续发射给下一级。
2.Function泛型第一个是传进来的参数,第二个是返回值的类型
flatMap操作符
类似map。FlatMap将一个Observable变换成多个Observable,将它们合并发射。不保证事件的顺序。
使用场景:多个网络请求依次依赖
1、注册用户前先通过接口A获取当前用户是否已注册,再通过接口B注册;
2、注册后自动登录,先通过注册接口注册用户信息,注册成功后马上调用登录接口进行自动登录。
concatMap操作符
concatMap和flatMap几乎一样,它能保证事件的顺序。
Flowable背压
Flowable返回值为Publisher或其实现类。Flowable是publisher的实现类,少写一个for循环,用了forArray()方法。解决背压问题