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()方法。解决背压问题

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值