简略分析Android的Retrofit应用开发框架源码

2019-12-10 19:05:30于丽

我们可以看到Retrofit.create()之后,返回了一个接口的动态代理类的实例,那么我们调用这个代理类的方法时,调用自然就被发送到我们定义的InvocationHandler中,所以调用

Call<List<SearchResult>> searchResultsCall = resetApi.search("retrofit"); 

时,直接调用到InvocationHandler的invoke方法,下面是invoke此时的上下文:

  @Override 
   public Object invoke(Object proxy, Method method, Object... args)
     throws Throwable {
     //proxy对象就是你在外面调用方法的resetApi对象
     //method是RestApi中的函数定义,
     //据此,我们可以获取定义在函数和参数上的注解,比如@GET和注解中的参数
     //args,实际参数,这里传送的就是字符串"retrofit"

    //这里必然是return 一个Call对象
    return loadMethodHandler(method).invoke(args);
   }

此时,invoke的返回必然是一个Call,Call是Retrofit中对一个Request的抽象,由此,大家应该不难想象到loadMethodHandler(method).invoke(args); 这句代码应该就是去解析接口中传进来的注解,并生成一个OkHttpClient中对应的请求,这样我们调用searchResultsCall时,调用OkHttpClient走网络即可。确实,Retrofit的主旋律的确就是这样滴。

注意,实际上Call,CallBack这种描述方式是在OkHttp中引入的,Retrofit底层使用OkHttp所以也是使用这两个类名来抽象一个网络请求和一个请求回来之后的回调。总体来看,Retrofit中的Call Callback持有一个OkHttp的Call Callback,将对Retrofit中的各种调用转发到OkHttp的类库中,实际上这里就是静态代理啦,因为我们会定义各种代理类,比如OkHttpCall

注 下文中如不无明确支出,则所有的Call,CallBack都是Retrofit中的类
MethodHandler类
MethodHandler类,它是Retrofit中最重要的抽象了,每一个MethodHandler对应于本例的RestApi中的一个每个方法代表的请求以及和这个请求相关其它配置,我们来看看吧。