Android架构实战(三)—— Retrofit
在介绍完RxJava后(Android架构实战(二)—— RxJava)之后,相信大家对响应式框架已经有了一定的了解了。如果你想要进一步的去使用RxJava的话,那么一定不能错过Retrofit这个网络请求开源库。一、简介Retrofit 是由 Square提供,主要由JakeWharton开发的,是一款为REST API 量身打造的网络请求库。可以说,时下最热门的两款网络请求库就是Ret
·
在介绍完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,我认为这个重构过程还是很值得的。
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
已为社区贡献1条内容
所有评论(0)