retrofit源码解析

2019-04-21  本文已影响0人  柳岸风语

Retrofit已经流行好久了,他是square公司开源的一个优秀的网络框架,这个内部对OkHttp进行了封装,使得利用okhttp进行网络访问变得更加简单。

简单使用
        OkHttpClient okHttpClient = new OkHttpClient.Builder()
                .retryOnConnectionFailure(true)
                .callTimeout(10, TimeUnit.SECONDS)
                .connectTimeout(10, TimeUnit.SECONDS)
                .connectTimeout(10, TimeUnit.SECONDS)
                .build();

        mRetrofit = new Retrofit.Builder()
                .baseUrl("http://www.baidu.com/")
                .client(okHttpClient)
                .addCallAdapterFactory(RxJavaCallAdapterFactory.create())
                .addConverterFactory(GsonConverterFactory.create())
                .callbackExecutor(new SerializeExecutor(new ThreadExecutor()))
                .build();

      public <Service> Service create(Class<Service> serviceClass) {
            Service service = (Service) serviceMap.get(serviceClass);
            if (service != null) {
                return service;
            }
            synchronized (serviceMap) {
                service = (Service) serviceMap.get(serviceClass);
                if (service == null) {
                    service = mRetrofit.create(serviceClass);
                    serviceMap.put(serviceClass, service);
                }
            }
            return service;
        }

接下来我们就需要详细去解析Retrofit请求网络的流程了。

1、Retrofit的创建

retrofit拥有6个重要的成员变量,下面我们就先来讲讲这五个成员变量:

  1. callFactory 这个变量其实就是OkHttpClient的对象,主要用来创建okhttp的RealCall来发起请求;
  2. baseUrl 基础url,用来拼接访问连接,在真实的网络请求中如果我们设置了完整的访问路径,这个url就不起作用了;
  3. callAdapterFactories CallAdapter的工厂集合,CallAdapter的功能是将我们okhttp的call转换成我们定义的方法的返回类型,比如Rxjava的Observable。在请求的时候,会遍历整个集合,根据方法的返回值和注解找到合适的CallAdapter
  4. converterFactories Converter的工厂集合。Converter是将okhttp的请求结果的ResponseBody转换为我们自己想要的java类型。在结果返回后,会遍历整个集合找到合适的Converter来做类型转换;
  5. callbackExecutor 这个关系到我们请求回调发生在哪里,默认不设置的时候使用的是主线程,使用Handler进行线程切换;
  6. serviceMethodCache 记录加载的方法,复用以免二次加载;

这些我们可以根据自己的使用按需设置。

2、调用create方法

retrofit内部使用的是动态代理技术,这也很好理解,因为retrofit知道使用的时候才知道需要加载的方法属于哪个类。排除掉一些干扰方法后,就开始执行loadServiceMethod(method).invoke(args != null ? args : emptyArgs)

3. HttpServiceMethod

loadServiceMethod(method)目的是生成一个HttpServiceMethod对象,使用这个对象来进行方法的调用。我们这里就需要好好讲讲这个HttpServiceMethod了,它的对象的创建需要传入requestFactory、callFactory、callAdapter、responseConverter。callFactory、callAdapter、responseConverter,这些上面就讲过了,这里就不再赘述了。requestFactory顾名思义请求工厂,我们都知道,okhttp发起请求的时候需要传入Request,requestFactory会根据我们在自定义的方法的注解以及参数注解和参数帮我们生成Request

创建好HttpServiceMethod对象后,就调用invoke方法,实际里面执行的是callAdapter的adapt方法

4. 执行callAdapter的adapt(OkHttpCall)方法

callAdapter的adapt(OkHttpCall)就是okhttp的call转换成我们定义的方法的返回类型,比如Rxjava的Observable,最后去发起请求;请求的执行最后会交给OkHttpCall的enqueue和execute;这里我们只分析enqueue方法;

5. OkHttpCall的enqueue

  1. 生成okhttp请求的RealCall;
  2. 执行RealCall的enqueue方法
  3. 请求成功后使用Converter将ResponseBody转换成我们需要的java类,并回调
      T body = responseConverter.convert(catchingBody);
      return Response.success(body, rawResponse);

到这里Retrofit的流程大致就讲完了。谢谢观赏!

上一篇下一篇

猜你喜欢

热点阅读