retroift2.9.0原理解析

44 阅读4分钟

retroift2.9.0原理解析

retrofit是基于okhttp网络框架的基础上做的封装,使用了大量的设计模式,使网络请求更加便捷,同时减少代码的耦合性。

使用的设计模式

  1. 建造者模式
  2. 代理模式
  3. 工厂模式
  4. 适配器模式

使用方式:

1.首先通过建造者模式,实例化Retrofit对象

   Retrofit one =
        new Retrofit.Builder()
            .addCallAdapterFactory(callAdapter)
            .addConverterFactory(converter)
            .baseUrl(baseUrl)
            .callbackExecutor(executor)
            .callFactory(callFactory)
            .build();

2.然后通过create方法,创建请求的网络的接口实例(外观模式,统一调用方式)

    CallMethod example = retrofit.create(CallMethod.class);

3.然后通过接口实例对象调用其中的方法,获取call对象,通过execute同步方法或者enqueue异步方法请求网络数据

String result = extending.getResponseBody().execute().body().string();

源码分析:

1.建造者模式实例化Retrofit对象

    public Retrofit build() {
      if (baseUrl == null) {
        throw new IllegalStateException("Base URL required.");
      }

      okhttp3.Call.Factory callFactory = this.callFactory;
	  //如果callFactory为null,则使用okhttpclient
      if (callFactory == null) {
        callFactory = new OkHttpClient();
      }

      Executor callbackExecutor = this.callbackExecutor;
	  //如果callbackExecutor为null,则使用平台默认的callbackExecutor
      if (callbackExecutor == null) {
        callbackExecutor = platform.defaultCallbackExecutor();
      }

      // Make a defensive copy of the adapters and add the default Call adapter.
      //创建callAdapterFactor数组
      List<CallAdapter.Factory> callAdapterFactories = new ArrayList<>(this.callAdapterFactories);
	  //将平台默认的calladapterFactories加入数组
      callAdapterFactories.addAll(platform.defaultCallAdapterFactories(callbackExecutor));

      // Make a defensive copy of the converters.
      //创建converterFactories数组,数组个数为1+当前设置的converterFactories的个数+平台默认的converterFactories的个数
      List<Converter.Factory> converterFactories =
          new ArrayList<>(
              1 + this.converterFactories.size() + platform.defaultConverterFactoriesSize());

      // Add the built-in converter factory first. This prevents overriding its behavior but also
      // ensures correct behavior when using converters that consume all types.
      converterFactories.add(new BuiltInConverters());
	  //我们自己设置的converterFactories
      converterFactories.addAll(this.converterFactories);
	  //平台默认的converterFactories
      converterFactories.addAll(platform.defaultConverterFactories());
	  //实例化retrofit
      return new Retrofit(
          callFactory,
          baseUrl,
          unmodifiableList(converterFactories),
          unmodifiableList(callAdapterFactories),
          callbackExecutor,
          validateEagerly);
    }

2.调用create方法创建请求网络的接口实例,通过动态代理模式,生成请求网络接口实例的动态代理对象,所有接口中的方法调用,由动态代理的InvocationHandler转发

  public <T> T create(final Class<T> service) {
    validateServiceInterface(service);
	//动态代理生成请求数据的接口类
    return (T)
        Proxy.newProxyInstance(
            service.getClassLoader(),
            new Class<?>[] {service},
            new InvocationHandler() {
              private final Platform platform = Platform.get();
              private final Object[] emptyArgs = new Object[0];

              @Override
              public @Nullable Object invoke(Object proxy, Method method, @Nullable Object[] args)
                  throws Throwable {
                // If the method is a method from Object then defer to normal invocation.
                //如果这个方法是来自Object类中的方法,则把这个方法当做普通方法来调用
                if (method.getDeclaringClass() == Object.class) {
                  return method.invoke(this, args);
                }
                args = args != null ? args : emptyArgs;
			            //loadServiceMethod方法解析Method,返回一个HttpServiceMethod调用其invoke方法
                return platform.isDefaultMethod(method)
                    ? platform.invokeDefaultMethod(method, service, proxy, args)
                    : loadServiceMethod(method).invoke(args);
              }
            });
  }

也就是说当我们通过create方法获取到请求网络接口的实例对象,通过该对象调用请求数据的方法,最终方法会转发到InvocationHandler中的invoke方法中,重点是loadServiceMethod方法,在这个方法中,我们解析我们接口里面方法的参数,返回值类型,注解等。 以下是loadServiceMethod方法:

  ServiceMethod<?> loadServiceMethod(Method method) {
  	//从ConCurrentHashMap中获取ServiceMethod
    ServiceMethod<?> result = serviceMethodCache.get(method);
	//如果不为null,则直接返回该ServiceMethod对象
    if (result != null) return result;
	//同步锁,锁住ConCurrentHashMap
    synchronized (serviceMethodCache) {
      //从hashMap中获取缓存的serviceMethod
      result = serviceMethodCache.get(method);
	  //如果为空
      if (result == null) {
	  	//解析注解并保存在hashMap中
        result = ServiceMethod.parseAnnotations(this, method);
        serviceMethodCache.put(method, result);
      }
    }
    return result;
  }

这个方法中,会先从一个hashMap中取serviceMethod对象,如果没有,就解析该方法ServiceMethod.paseAnnotations

abstract class ServiceMethod<T> {
  static <T> ServiceMethod<T> parseAnnotations(Retrofit retrofit, Method method) {
  	//通过RequetFactory解析注解
    RequestFactory requestFactory = RequestFactory.parseAnnotations(retrofit, method);

    Type returnType = method.getGenericReturnType();
    if (Utils.hasUnresolvableType(returnType)) {
      throw methodError(
          method,
          "Method return type must not include a type variable or wildcard: %s",
          returnType);
    }
    if (returnType == void.class) {
      throw methodError(method, "Service methods cannot return void.");
    }

    return HttpServiceMethod.parseAnnotations(retrofit, method, requestFactory);
  }

  abstract @Nullable T invoke(Object[] args);
}

最后解析生成HttpServiceMethod对象,我们方法的所有信息都在这个类里面 看一看HttpServiceMethod类

 static <ResponseT, ReturnT> HttpServiceMethod<ResponseT, ReturnT> parseAnnotations(
      Retrofit retrofit, Method method, RequestFactory requestFactory) {
    boolean isKotlinSuspendFunction = requestFactory.isKotlinSuspendFunction;
    boolean continuationWantsResponse = false;
    boolean continuationBodyNullable = false;

    Annotation[] annotations = method.getAnnotations();
    Type adapterType;
    if (isKotlinSuspendFunction) {
		//获取泛型方法参数类型
      Type[] parameterTypes = method.getGenericParameterTypes();
      Type responseType =
          Utils.getParameterLowerBound(
              0, (ParameterizedType) parameterTypes[parameterTypes.length - 1]);
	  
      if (getRawType(responseType) == Response.class && responseType instanceof ParameterizedType) {
        // Unwrap the actual body type from Response<T>.
        responseType = Utils.getParameterUpperBound(0, (ParameterizedType) responseType);
        continuationWantsResponse = true;
      } else {
        // TODO figure out if type is nullable or not
        // Metadata metadata = method.getDeclaringClass().getAnnotation(Metadata.class)
        // Find the entry for method
        // Determine if return type is nullable or not
      }

      adapterType = new Utils.ParameterizedTypeImpl(null, Call.class, responseType);
      annotations = SkipCallbackExecutorImpl.ensurePresent(annotations);
    } else {
	  //获取泛型方法的返回值类型
      adapterType = method.getGenericReturnType();
    }
	//创建CallAdapter,将adapterType也就是泛型方法返回值类型传入
    CallAdapter<ResponseT, ReturnT> callAdapter =
        createCallAdapter(retrofit, method, adapterType, annotations);
    Type responseType = callAdapter.responseType();
    if (responseType == okhttp3.Response.class) {
      throw methodError(
          method,
          "'"
              + getRawType(responseType).getName()
              + "' is not a valid response body type. Did you mean ResponseBody?");
    }
    if (responseType == Response.class) {
      throw methodError(method, "Response must include generic type (e.g., Response<String>)");
    }
    // TODO support Unit for Kotlin?
    if (requestFactory.httpMethod.equals("HEAD") && !Void.class.equals(responseType)) {
      throw methodError(method, "HEAD method must use Void as response type.");
    }

    Converter<ResponseBody, ResponseT> responseConverter =
        createResponseConverter(retrofit, method, responseType);

    okhttp3.Call.Factory callFactory = retrofit.callFactory;
    //注意这里:如果不是kotlin挂起方法,创建CallAdapted,将我们通过CallAdapterFactory创建的callAdapter对象传入
    if (!isKotlinSuspendFunction) {
      return new CallAdapted<>(requestFactory, callFactory, responseConverter, callAdapter);
    } else if (continuationWantsResponse) {
      //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
      return (HttpServiceMethod<ResponseT, ReturnT>)
          new SuspendForResponse<>(
              requestFactory,
              callFactory,
              responseConverter,
              (CallAdapter<ResponseT, Call<ResponseT>>) callAdapter);
    } else {
      //noinspection unchecked Kotlin compiler guarantees ReturnT to be Object.
      return (HttpServiceMethod<ResponseT, ReturnT>)
          new SuspendForBody<>(
              requestFactory,
              callFactory,
              responseConverter,
              (CallAdapter<ResponseT, Call<ResponseT>>) callAdapter,
              continuationBodyNullable);
    }
  }

这里面调用了适配器的方法,把方法中的请求参数类型和返回值类型,通过适配器,转换成对服务器友好请求参数,和对用户友好的返回结果。 然后通过invoke方法执行方法

  @Override
  final @Nullable ReturnT invoke(Object[] args) {
  	//创建okHttpCall对象,并调用adapt方法
    Call<ResponseT> call = new OkHttpCall<>(requestFactory, args, callFactory, responseConverter);
    return adapt(call, args);
  }

这里我们会获取到我们的call对象,然后调用adapt方法,进一步执行adapter方法

  protected abstract @Nullable ReturnT adapt(Call<ResponseT> call, Object[] args);

  static final class CallAdapted<ResponseT, ReturnT> extends HttpServiceMethod<ResponseT, ReturnT> {
    private final CallAdapter<ResponseT, ReturnT> callAdapter;

    CallAdapted(
        RequestFactory requestFactory,
        okhttp3.Call.Factory callFactory,
        Converter<ResponseBody, ResponseT> responseConverter,
        CallAdapter<ResponseT, ReturnT> callAdapter) {
      super(requestFactory, callFactory, responseConverter);
      this.callAdapter = callAdapter;
    }

    @Override
    protected ReturnT adapt(Call<ResponseT> call, Object[] args) {
      return callAdapter.adapt(call);
    }
  }

可以看到adapt是个抽象方法,注意前面代码中的“注意这里”,我们已经创建了CallAdapted对象,所有adapt方法最终汇之星CallAdpted的adapt方法,而其中的callAdapter就是我们通过CallAdapteFactory创建的adapter,如果没有创建,就用默认的defaultCallAdapterFactroy

final class DefaultCallAdapterFactory extends CallAdapter.Factory {
  private final @Nullable Executor callbackExecutor;

  DefaultCallAdapterFactory(@Nullable Executor callbackExecutor) {
    this.callbackExecutor = callbackExecutor;
  }

  @Override
  public @Nullable CallAdapter<?, ?> get(
      Type returnType, Annotation[] annotations, Retrofit retrofit) {
    if (getRawType(returnType) != Call.class) {
      return null;
    }
    if (!(returnType instanceof ParameterizedType)) {
      throw new IllegalArgumentException(
          "Call return type must be parameterized as Call<Foo> or Call<? extends Foo>");
    }
    final Type responseType = Utils.getParameterUpperBound(0, (ParameterizedType) returnType);

    final Executor executor =
        Utils.isAnnotationPresent(annotations, SkipCallbackExecutor.class)
            ? null
            : callbackExecutor;

    return new CallAdapter<Object, Call<?>>() {
      @Override
      public Type responseType() {
        return responseType;
      }

      @Override
      public Call<Object> adapt(Call<Object> call) {
        return executor == null ? call : new ExecutorCallbackCall<>(executor, call);
      }
    };
  }

到这里的adapt,我们获取到了我们的call对象,就可以执行网络请求了。