栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

安卓开发——Retrofit网络库的设计思想以及基本使用

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

安卓开发——Retrofit网络库的设计思想以及基本使用

网络请求的痛点(可略过不看)

  1. 同一款应用程序发起的网络请求绝大多数指向是同一个服务器域名。
  2. 服务器提供的接口通常可以根据功能来分类。
  3. 开发者希望“调用一个接口获取它的返回值”这样的方式,而不是直接调用服务器接口。
    (说白了就是不想关心通讯细节)

Retrofit的好处
项目主页地址:https://github.com/square/retrofit

  1. 可以配置一个根路径,然后在指定服务器接口地址的时候只需要使用相对路径即可,这样就不用每次都指定完整的URL地址了。
  2. Retrofit允许我们对服务器进行归类,将功能同属一类的服务器接口定义到同一个接口文件中,让代码结构更加合理。
  3. 只需要在接口文件中声明一系列方法和返回值,然后通过注解的方式指定该方法对应哪个服务器接口,以及需要提供哪些参数。

程序调用方法,Retrofit会自动向对应的服务器接口发起请求,并将相应的数据解析成返回值声明的类型。

实际使用简单示例

①首先添加依赖
在app/build.gradle文件中添加

由于Retrofit是基于OkHttp开发的,因此添加第一条依赖会自动将Retrofit、OkHttp、Okio库一起下载。

此外,Retrofit会将服务器返回的JSON数据自动解析成对象,所以会自动将GSON库一起下载。

由于Retrofit会借助GSON将JSON数据转换成对象,那么这里新增一个App类,并加入id、name、version三个字段

接下来根据服务器接口的功能进行归类

通常Retrofit的接口文件建议以具体功能种类名开头,并以Service结尾(一种命名习惯)

注意@GET注解的使用,表示当调用getAppData()方法时候Retrofit会发起一条GET请求,地址就是后边传入的具体参数(这里的get_data.json是一个相对路径,根路径我们稍后设置)

getAppData()方法的返回值必须声明成Retrofit中内置的Call类型,并通过泛型指定服务器响应的数据应该转换成什么对象。这里由于响应的是一个包含App数据的JSON数组,因此我们将泛型声明成
(这是是假设的需求,并不是其他的也要数组类型)

Retrofit还可以结合RxJava使用可以将返回值声明成Observable、Flowable等类型,知道有这么码事先,这里不做讨论。

下面是使用步骤:

  1. 利用Retrofit.Builder创建Retrofit实例,注意这里要用.baseUrl(“www.baidu.com”)指定根路径,还有.addConverterFactory(GsonConverterFactory.create())指定解析方式,最后调用.bulid()完成实例创建。
  2. 利用Retrofit 实例的creat()方法传入相应的class.java接口文件创建接口的动态代理对象。(拿到这个动态代理对象就是为了使用接口中的方法)
  3. 动态代理对象调用接口中的getAppData()方法,返回一个

  4. 类型的数据,再调用enqueue()方法,Retrofit会根据注解进行网络请求并将服务器回应数据回调到enqueue()方法中传入的Callback实现里面。
    (Retrofit发起请求的时候会自动在内部开启子线程,当数据回调到CallBack之后,Retrofit又会切回主线程)
  5. 最后在Callback的onResponse()方法中调用response.body()方法达到Retrofit解析后的对象,也就是

    对象,这样就完成了请求解析。
    (注意在Callback中要实现onResponse与onFailure)

这里拿到数据只进行了简单遍历打印

如果传入的是HTTP,记得要进行网络安全配置,从Android 9.0开始,应用程序默认只支持HTTPS传输
方法在我的其他文章

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/281239.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号