博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android小知识-Retrofit框架的介绍以及使用方式
阅读量:7096 次
发布时间:2019-06-28

本文共 3613 字,大约阅读时间需要 12 分钟。

本平台的文章更新会有延迟,大家可以关注微信公众号-顾林海,包括年底前会更新kotlin由浅入深系列教程,目前计划在微信公众号进行首发,如果大家想获取最新教程,请关注微信公众号,谢谢!

Retrofit是Square公司推出的一个HTTP的框架,主要用于Android和Java,Retrofit会将每一个HTTP的API请求变成一个Java的接口,使用起来非常方便,同时Retrofit又是一个Restful HTTP的网络请求框架的封装。

在上图中,我们会在应用层发起网络请求,同时请求会经过Retrofit这层,Retrofit会将我们的网络请求的参数进行封装,最后通过OkHttp层向服务端发起网络,服务端会将响应返回给OkHttp层,OkHttp层再将请求结果交给Retrofit层,最后再返回给应用层。

总结来说:也就是说App应用程序通过Retrofit请求网络,实际上是使用Retrofit接口层封装请求参数,之后交由OkHttp完成后续的请求操作,在服务端返回数据后,OkHttp将原始数据的结果交给Retrofit,Reftrofit将根据用户的需求对结果进行解析。

接下来讲解Retrofit的用法,首先添加网络访问权限以及Retrofit库的依赖:

权限:

    
复制代码

Retrofit库的依赖:

    implementation 'com.squareup.retrofit2:retrofit:2.4.0'复制代码

创建服务端返回的数据类型:

public class MyResponse {    String title;    String imgUrl;    int collectNum;}复制代码

创建一个用于描述网络请求的接口:

public interface NetworkInterface {    @GET("news/newsDetail")    Call
getNewsDetails(@QueryMap Map
map);}复制代码

Retrofit将每一个HTTP请求抽象成了Java接口类,同时采用注解方式来描述并配置网络的请求参数,内部通过动态代理将接口的注解转换成HTTP请求,上面通过注解@GET表示本次请求网络的方式是GET请求,括号内部定义了请求的部分URL ,getNewsDetail方法内的参数使用了@QueryMap注解,说明我们可以传入任何键值对集合Map。

接着创建Retrofit并进行网络请求:

private void initRetrofit() {        Retrofit retrofit = new Retrofit.Builder()                .baseUrl("http://icould.glh/")                .addConverterFactory(GsonConverterFactory.create())                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())                .build();        NetworkInterface networkInterface = retrofit.create(NetworkInterface.class);        Map
params = new HashMap<>(); params.put("newsId", "1"); params.put("token", "yud133f"); Call call = networkInterface.getNewsDetails(params); call.enqueue(new Callback() { @Override public void onResponse(Call call, Response response) { System.out.println(response.body()); } @Override public void onFailure(Call call, Throwable t) { System.out.println("请求错误"); } }); }复制代码

通过Retrofit的Builder模式创建Retrofit对象,通过baseUrl来指定网络请求的URL,这个URL加上网络请求接口类中通过注解定义的URL,就凑成了完整的URL;通过addConverterFactory方法设置服务返回后数据的解析器,Retrofit可以指定任意的数据解析器,这里采用的是GSON数据解析器,需要在gradle中引入它的依赖库。

    implementation 'com.squareup.retrofit2:converter-gson:2.4.0'复制代码

通过addCallAdapterFactory方法设置网络请求的适配器,Retrofit可以支持多种的网络请求适配器方式,比如Java8和RxJava,这里采用RxJava,通过gradle引入它的依赖。

    implementation 'com.squareup.retrofit2:adapter-rxjava:2.4.0'复制代码

通过Retrofit的create方法创建网络请求接口实例networkInterface,接着调用网络请求接口实例中的getNewsDetails方法并传入相关的键值对集合。最后通过Call对象执行异步或同步请求,这里通过enqueue方法执行异步请求并传入Callback实现两个回调方法。

总结:

  1. 添加Retrofit库的依赖以及网络权限。

  2. 创建服务器返回的数据类型的类。

  3. 创建用于描述网络请求的接口。

  4. 通过建造者模式创建Retrofit实例,并设置URL、数据解析器、网络请求适配器等等。

  5. 通过Retrofit的create方法创建网络请求的实例。

  6. 调用网络请求实例中的方法获取Call并发送网络请求。

关于Retrofit的使用流程已经介绍完毕,下面大致讲讲Retrofit内部请求的一个流程,为后面源码分析做准备。

Retrofit不是网络请求框架,它只是对网络请求框架的封装,在Retrofit中首先创建Retrofit这个类,它是Retrofit框架统一的一个入口,通过Retrofit的内部类Builder对网络请求的参数进行配置,Builder内部的ServiceMethod对象非常非常的重要,它对应着我们写好的接口类中的一个方法,通过动态代理的方式将我们自己定义好的接口以及接口中的参数、方法统一转换成一个个的HTTP请求,ServiceMethod对应的就是我们接口类当中定义好的方法,通过ServiceMethod可以解析方法中的各种注解,最后生成Request对象。创建完ServiceMethod对象之后,就可以创建OkHttpCall请求,通过这个OkHttpCall可以进行同步请求或异步请求。

在ServiceMethod当中生成了三个非常重要的工厂类,分别是CallAdapter工厂、Converter工厂以及CallFactory。CallAdapter工厂用于生产CallAdatper,在Retrofit中默认会将我们的请求封装成OkHttp的Call对象, CallAdapter的作用就是将我们的OkHttp的Call转换成被不同平台调用的适配器。Converter工厂用于生产数据转换器Converter,使用Converter可以将返回的Response转换成我们能使用的Java对象。CallFactory是用于创建Call请求类的,在Retrofit中一个个HTTP请求被封装成Call类。

有了OkHttpCall以及ServiceMethod中的三个工厂,就可以将网络请求OkHttpCall通过CallAdapter适配不同平台,在通过Converter解析返回的数据Response,如果是异步请求在拿到Response后会通过callbackExecutor进行线程切换来传递数据。


搜索微信“顾林海”公众号,定期推送优质文章。

转载地址:http://fnaql.baihongyu.com/

你可能感兴趣的文章
Js操作剪切板
查看>>
ubuntu19.04+mysql5.7 中 Mysql:ERROR 1698 (28000): Access denied for user 'root'@'localhost'
查看>>
R语言绘制横向柱装图
查看>>
掰弯Wicket: 让wicketstuff-restannotations与wicket-spri
查看>>
emacs 下载地址
查看>>
mysql 表导出/导入
查看>>
Java垃圾回收简介
查看>>
家用无线路由器的设置
查看>>
我的友情链接
查看>>
nginx location匹配规则
查看>>
pip、easy_install切换国内源
查看>>
2000字毕业个人自我鉴定范文
查看>>
eclipse构建maven的web项目
查看>>
深入浅出MyBatis:MyBatis的所有配置
查看>>
StringBuffer.append比String加号好在那里?反编译的思路很赞
查看>>
MBaaS-LiveOak系列一:LiveOak简介
查看>>
【2016-03-12】HBase、Redis、Mongodb比较(未完待续)
查看>>
互联网公司:4家面试心得
查看>>
电脑常见问题及解决办法
查看>>
修改word2010的样式 快捷键
查看>>