Android百大框架第七期-《类型安全的网络框架Retrofit》

 金诚   2018-05-10 11:32   197 人阅读  0 条评论

前言

Retrofit介绍:Retrofit是square团队出品的又一Java网络框架。与其他网络框架相比,retrofit的特点是“类型安全”。本文将围绕着如何使用Retrofit与服务端进行HTTP通讯、Retrofit的重要知识点、Retrofit与类型安全的联系展开讨论。

入门之旅

增加依赖

在build.gradle中增加依赖

增加网络权限

Android6.0以上需要动态权限处理。

测试get请求

需求:我们通过github官方提供的API,查询指定项目指定作者的贡献次数

第一步:构建Retrofit对象

第二步:用Retrofit生成协议类实例化对象

由第二步,引申出第三步,定义协议类(又名接口类)

由第三步引申出第四步,创建数据类Contributor,数据类的作用是在协议类与Retrofit类之间传递数据信息

第五步,用协议类对象,获得Call对象

第六步,用call对象,发起请求,既可异步执行,也可同步执行

(1)异步执行

(2)同步执行

  1. 数据类定义:有意义的对象
  2. 数据类介绍:
    在协议类中,每个函数的返回值默认是RespoBody,遵循Retrofit类型安全的规则,以及纵览Retrofit的samples示例,Retrofit都希望开发者能在协议类拿到有意义的返回值,那么对开发者就产生了两点要求:
  3. 在协议类中,每个函数的返回值类型,定义有意义的对象
  4. 事先设计好有意义的Object对象,比如示例中的Contributor

正是因为数据类Contributor的存在,才能检验服务端是否返回正确的数据类型;也极大的方便开发者从服务端返回的数据中取值、判断,进行后续的业务编码。

Converter

在默认情况下Retrofit只支持将HTTP的响应体转换换为ResponseBody,这也是为什么我在前面的例子接口的返回值都是 Call,但如果响应体只是支持转换为ResponseBody的话何必要引入泛型呢,返回值直接用一个Call就行了嘛,既然支持泛型,那说明泛型参数可以是其它类型的,而Converter就是Retrofit为我们提供用于将ResponseBody转换为我们想要的类型,有了Converter之后我们就可以写把我们的第一个例子的接口写成这个样子了:

没有Converter之前,这么写:

有了Converter之后,这么写
1. 协议类:

  1. gson依赖

  1. 给Retrofit设置Converter

这样Retrofit就会使用Gson将ResponseBody转换我们想要的类型。

注:完成这一前提的条件是,服务端返回的数据格式是Json,如果不是,则会转换失败。因此,与服务端事先约定好数据格式,是至关重要的。

下面演示如何将利用Converter 将Object封装为Gson发送至服务端
1. 在协议类中增加方法

被@Body注解的的Blog将会被Gson转换成RequestBody发送到服务器。

  1. 实例化协议类

自定义Converter

  1. 介绍:实际开发中,服务端返回的数据各种格式,解析起来不太方便,后续的业务逻辑也相当繁琐;Retrofit提供的Converter是一个接口,方便我自定义Converter,将服务端返回的数据转换成我们期望的数据格式,方便客户端编写业务。

  2. 先来熟悉一下Converter的源码:

  1. 自定义StringConverter

  1. 我们需要一个Fractory来向Retrofit注册StringConverter

  1. 使用Retrofit.Builder.addConverterFactory向Retrofit注册我们StringConverterFactory:

引入CallAdapter

说到Retrofit就不得说到另一个火到不行的库RxJava,网上已经不少文章讲如何与Retrofit结合,但这里还是会有一个RxJava的例子,不过这里主要目的是介绍使用CallAdapter所带来的效果。

第3节介绍的Converter是对于Call中T的转换,而CallAdapter则可以对Call转换,这样的话Call中的Call也是可以被替换的,而返回值的类型就决定你后续的处理程序逻辑,同样Retrofit提供了多个CallAdapter,这里以RxJava的为例,用Observable代替Call:

  1. 引入RxJava支持:

  1. 通过RxJavaCallAdapterFactory为Retrofit添加RxJava支持:

  1. 协议类定义函数,将原先的返回值类型由Call改为Observable

  1. 使用Rxjava的规则,处理后续的业务逻辑

自定义CallAdapter

Retrofit提供了自定义CallAdapter的示例,在samples/ErrorHandlingAdapter.java文件里

下面概览一下自定义CallAdapter的步骤:
1. 规定接口的功能

自定义MyCall,泛型T是期望接收的数据类类型,也就是我们后面要定义的数据类

  1. 自定义CallAdapter

CallAdapter实现了MyCall接口规定的方法、cancel、enqueue、onFailure,MyCallBack对象,用于向CallAdapter调用者返回数据,

  1. 定义MyCallback

MyCallback用于向调用者返回格式化后的数据;方便对开发者对各式各样的服务器响应码进行区分处理。

MyCallback接口事先规定了几种常见服务器应答码。

  1. 定义协议类和数据类

  1. 使用CallAdapter处理业务逻辑

Retrofit知识点

  1. Retrofit
  2. 协议类、接口类、注解类
  3. Call、ResponseBody
  4. 自定义数据类
  5. Converter
  6. CallAdapter
  7. okhttp

Retrofit知识结构

  1. Retrofit、协议类、Converter
  2. 协议类、数据类、Call、ResponseBody
  3. Retrofit、CallAdapter
  4. Retrofit、Okhttpclient

附录

Retrofit提供了一些扩展能力,补充一些可能需要增加的依赖,

参考

  1. Retrofit官网
  2. 网友提供的Retrofitdemo,有详细的使用示例
本文地址:http://www.yangchaofan.cn/archives/554
版权声明:本文为原创文章,版权归 金诚 所有,欢迎分享本文,转载请保留出处!

说点什么

avatar
  Subscribe  
提醒