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
原创粉丝点击