Retrofit2.0简单探究

Retrofit简单了解(以下Retrofit的指定Retrofit2.0版本)


1.简单使用(以访问一个github接口为例)

   step1:添加gradle依赖

//必须配置
implementation 'com.squareup.retrofit2:retrofit:version'
//根据具体的解析数据工具配置
 implementation 'com.squareup.retrofit2:converter-simplexml:version'

    step2:定义接口API

 public interface Api {
     String BASE_URL = "https://github.com/";
     @GET("JakeWharton")
     Call<String> tabsContents(@Query("tab") String tab);
 }

    step3:创建Retrofit实例

Retrofit retrofit = new Retrofit.Builder()
        .baseUrl(Api.BASE_URL)
        .addConverterFactory(SimpleXmlConverterFactory.create())
        .build();

    step4:获取API实例

 Api api = retrofit.create(Api.class);

    step5:调用对应的接口

retrofit2.Call call = api.tabsContents("repositories");
    call.enqueue(new Callback<String>() {
        @Override
        public void onResponse(Call call, Response response) {
    
        }

        @Override
        public void onFailure(Call call, Throwable t) {
        
        }
    });

2.由简单的GET方法跟踪调用过程代码


    Part1:Retrofit的创建过程


        (1).创建Retrofit.Builder


            构建Builder对象,跟踪代码至Builder的实际构造代码中,关键步骤是首先获取平台对象,然后初始化OkHttpClient的适配器工厂类和数据解析器工厂类,最后赋值默认的结果线程回调处理对象。
            关键类:Platform,CallAdapter.Factory,Converter.Factory

  •      Platform的主要功能是返回线程调度器和CallAdapter适配器工厂。该类的获取是通过类反射方式得到平台对象,Android平台默认实现是retrofit2.Platform.Android,返回线程切换调度器MainThreadExecutor和Call适配器工厂ExecutorCallAdapterFactory。
  •       CallAdapter.Factory的主要功能是提供Call的适配器工厂类,因为Retrofit对Call的调用使用的适配器模式,而为了Retrofit的扩展性,框架兼容了不同平台例如Guava,Android,RxJava等,是的由各自的平台提供自己的Adapter,从而提高了对Call接口调用和回调方式的灵活性。
  •       Converter.Factory的功能是提供了数据解析工厂类,支持json,xml,protobuf等多种数据解析的方式。

        

(2).baseUrl设置url


            Retrofit符合RESTful设计风格,因此为了简化接口配置的工作量,可以将接口scheme和host层抽取出来。该方法不仅仅简单的配置了url还会对该url进行校验,具体的校验过程在okhttp3.HttpUrl这个工具类中。如果不符合会在创建过程中抛出异常以便调用者及时发现修改。


        (3).build创建过程


            标准的Builder构造者模式,可以在此看到Retrofit默认使用OkHttp处理网络请求,有意思的一点是在给Retrofit设置CallAdapterFactory和ConvertFactory时是使用的Collections.unmodifiableList方法处理后的集合,保证了该处理类集合在使用过程中不会被篡改。

    Part2:Retrofit的使用过程


            Retrofit的使用过程主要就是Api函数的解析过程。

这里使用了动态代理模式,通过Retrofit.create方式获取Api实例。

           最差情况下会通过InvocationHandler的invoke函数中的Method对象创建函数对象ServiceMethod,而后在ServiceMethod中通过对Api中的函数的注解以及参数进行解析处理。该过程为Retrofit的关键流程,以下会详细解析:

  •     首先,从Retrofit#serviceMethodCache中查找是否已经解析生成的ServiceMethod实例,如果有直接返回。
  •      然后,通过Retrofit#loadServiceMethod方法创建ServiceMethod并保存。在ServiceMethod的创建过程中同样适用Builder模式进行创建。ServiceMethod.Builder的构造函数中,持有了Retrofit和Method的实例,并且拿到了Api函数中定义的函数注解(method.getAnnotations()),函数参数类型(method.getGenericParameterTypes()),函数参数注解(method.getParameterAnnotations())。而后通过build方法构造ServiceMethod对象,在build过程中,会依次createCallAdapter(),createResponseConverter(),parseMethodAnnotation(),parseParameter()这四个过程非常重要且复杂。

     createCallAdapter():通过传入Method的returnType和annotations调用了Retrofit的nextCallAdapter函数,获取到了平台对应的CallAdapter。
     createResponseConverter():同样通过传入Method的returnType和annotations调用Retrofit的nextResponseBodyConverter的方法,这里返回数据解析工具对象。
     parseMethodAnnotation():遍历函数所有的注解并解析,以@GET为例,会判断@GET是否符合内部预定义的注解,然后获取到对应path路径或者path参数。
     parseParameter():该方法会在Method的参数的注解遍历过程中调用,传入的参数是Method的参数类型和对应的参数注解,内部依旧是调用parseParameterAnnotation函数,以@QUERY参数为例,会判断参数类型,如果是普通类型,则会创建ParameterHandler.QUERY实例返回,ParameterHandler的主要作用是将参数按照对应的请求类型添加至接口参数中。当OkHttpCall的extcute/enqueue方法被调用时,内部调createCall() -> toCall(),toCall中会获取ParameterHandler,然后对参数进行处理,可见此处使用策略模板模式。

  •    最后就是传统的build返回ServiceMethod

        (2).然后以serviceMethod和method为构造参数创建OkHttpCall对象。OkHttpCall对象是适配器模式中的adapte,会有对应平台的CallAdapter调用。
        (3).最后invoke方法的返回值是ServiceMethod的adapte方法的返回值。该方法内部调用的是CallAdapter的adapte方法,意即传入参数一定是OkHttpCall,即适配器模式中的adapte一定是OkHttpCall,而返回值则有对应的平台决定例如RxJava定义的返回值类型是Observale。

 

    3.到此,Retrofit的简单使用基本分析完毕。


    可以看到,这个框架是对网络请求接口的封装,并不是真正的完成网络请求,从参数的封装以及回调的封装来看设计上的解耦以及扩展性做的非常强,其中使用到的设计模式例如工厂,适配器,构建者,策略模板,外观等也是很多,另外这里对Java中的Annotation和Type的使用也非常多,如果想深入理解,这些概念也是必须熟练的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值