Android架构实战(三)—— Retrofit
来源:互联网 发布:js定义有返回值的函数 编辑:程序博客网 时间:2024/06/03 17:20
在介绍完RxJava后(Android架构实战(二)—— RxJava)之后,相信大家对响应式框架已经有了一定的了解了。如果你想要进一步的去使用RxJava的话,那么一定不能错过Retrofit这个网络请求开源库。
一、简介
Retrofit 是由 Square提供,主要由JakeWharton开发的,是一款为REST API 量身打造的网络请求库。可以说,时下最热门的两款网络请求库就是Retrofit和Volley了。关于两者的比较,我在译文Android Async HTTP Clients: Volley vs Retrofit中已经进行了一番比较。就个人使用感觉而言,Retrofit相比Volley更加简洁,速度稍快(纯粹个人感觉,没有实际测量),而且兼容性更好(可以支持直接POST字符串、文件等,而Volley则需要另外添加一个类才能实现)。但是,我花了大工夫把现有工程中的Volley替换为Retrofit最大的原因是——对Observable的支持。
二、Retrofit使用简介
具体的使用方法在官方文档上已经有详细的介绍了,在这里我不作过多的讲解,只是大致介绍一下。Retrofit的使用由两个部分组成:定义REST API的接口和定义全局请求参数的RestAdapter。
1、 Rest API 接口
大概是为了提高简洁性,Retrofit使用了注解和接口组合来实现API的定义,并且支持各类请求形式,以下为比较常见的四种:
<span style="font-size:14px;">public interface RestApi { @GET("/users/{id}") User getUserByPath(@Path("id") int groupId); @GET("/users") User getUserByParameter(@Query("id") int groupId); @POST("/users") User getUserByField(@Field("id") String id); @POST("/users") User getUserByBody(@Body TypedString id);}</span>同时,Retrofit还支持3种形式的执行方法:
<span style="font-size:14px;">public interface RestApi { @GET("/users") User getUserSynchronously(@Query("id") int groupId); @GET("/users") void getUserWithCallback(@Query("id") int groupId, Callback callback); @GET("/users") Observable<User> getUserWithObservable(@Query("id") int groupId);}</span>注意,最后一个形式中,返回类型是一个Observable!没错,如果你还不太了解如何自己去构造一个Observable对象的话,那么Retrofit直接帮你解决了这个问题,让你无缝衔接RxJava。
2、RestAdapter
RestAdapter是Retrofit提供的一个工厂类,你可以通过配置RestAdapter设置网络请求的一些公共参数,如根域名、HTTP头参数、请求解析类、调试信息等参数。参数设置完后,简单的调用create()方法,你所定义的REST接口类的一个示例就爱生成了。示例如下:
<span style="font-size:14px;"> RestAdapter restAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setLogLevel(RestAdapter.LogLevel.FULL) .setConverter(new GsonConverter(new Gson())) // 这是默认配置,实际使用中可以去掉 .build(); RestApi restApi = restApiAdapter.create(RestApi.class);</span>在使用中,你可以将生成的restApi作为一个静态全局变量,避免重复的初始化。其中的Converter是用来指示Retrofit如何将返回的数据进行转化,通常情况下,REST API是以JSON的形式返回数据,所以默认的Converter也就是GsonConverter了。如果你的服务器不提供REST接口,那么你也可以自定义你需要Converter,比如将返回数据直接转化为字符串,然后自行处理等。
当然RestAdapter还支持其他的配置,接口中也支持定义一些部分API特有的属性,这些细节在官方文档中都有详细的介绍,在这里就不再赘述了。
三、Retrofit与Android架构
在架构中,请求数据属于Model层,并且通过UseCase实现与Presenter层的交接。在示例中,RestApi和RestAdapter都被封装在了一个RestRepository中。Repository作为一个UseCase和数据之间的媒介,将所有的REST请求都封装在了里面,以单例的形式存在,提供了一个比较方便的使用方法。示例如下:public class RestRepository { public RestApi restApi; private static RestRepository restRepository; public static RestRepository getInstance() { if (restRepository == null) restRepository = new RestRepository(); return restRepository; } public RestRepository() { RestAdapter restApiAdapter = new RestAdapter.Builder() .setEndpoint("https://api.github.com") .setLogLevel(RestAdapter.LogLevel.FULL) .build(); restApi = restApiAdapter.create(RestApi.class); }}一个简单的懒汉模式单例,在创建的时候对RestAdapter和RestApi都进行初始化,然后再定义方法将API中的每一个方法都暴露出去就好了。然后,只需要在UseCase中获取Repository对象,并通过相应的方法就可以获取到Observable对象了。
四、总结
总得来说,Retrofit为开发人员使用RxJava提供了一个非常友好的支持,在网络请求方面不需要去考虑如何合理的构造一个Observable,所以使用起来十分的方便。在性能和简洁性方面,Retrofit也略优于Volley。而且Volley现在基本已经停止更新了,而Retrofit目前仍然在不断的更新,因此更加能够适应新的需求。
所以,在这里,我还是强烈推荐大家开始使用Retrofit,哪怕将项目中的Volley替换成Retrofit,我认为这个重构过程还是很值得的。
0 0
- Android架构实战(三)—— Retrofit
- android开源库—retrofit(附实战源码)
- 基于.NET平台的分层架构实战(三)——架构概要设计
- 基于.NET平台的分层架构实战(三)——架构概要设计
- 基于.NET平台的分层架构实战(三)——架构概要设计
- 基于.NET平台的分层架构实战(三)—架构概要设计
- Android架构实战(一)—— 核心思想
- Android架构实战(二)—— RxJava
- Android架构实战(四)—— Gson
- Android Mvp+Rxjava+Retrofit实战
- Android Mvp+RxJava+Retrofit 实战
- Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势
- Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势
- Android实战——RxJava2+Retrofit+RxBinding解锁各种新姿势
- Android MVP架构(RxJava+SQLBrite+Retrofit+OkHttp+Glide)
- android开发练习三-Retrofit
- Android框架学习之Retrofit(三)retrofit和okhttp的区别
- android 三剑客(Retrofit 2.0)简单使用
- [leetcode] Jump Game II
- Java语言程序设计进阶----第三周作业
- Eclipse调试Logcat类的说明
- 用Pandas作图
- hbase
- Android架构实战(三)—— Retrofit
- 【数据库】分组函数
- 【Struts2框架】第二节Result-向结果传参数
- 简学Oracle
- nyoj844 A+B Problem(V)
- caffe源码分析--SyncedMemory类代码研究
- Fedora 22 设置顶部 Top Bar 透明
- HD2021 发工资咯
- leetcode之路002 Add Two Numbers