美文网首页
retrofit源码解析

retrofit源码解析

作者: 柳岸风语 | 来源:发表于2019-04-21 15:39 被阅读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的流程大致就讲完了。谢谢观赏!

    相关文章

      网友评论

          本文标题:retrofit源码解析

          本文链接:https://www.haomeiwen.com/subject/pvfjgqtx.html