Android app开发中Retrofit框架的初步上手使用

2019-12-10 19:05:41王振洲

执行请求时会调用RestHandler的invoke方法,如上所示,主要是上面代码中标注有6点

如果调用的是Object的方法,不做处理直接调用。
通过getMethodInfo获取调用的Method对应的RestMethodInfo,前面说了,构造RestHandler对象时传进来了一个Method->RestMethodInfo的映射,初始时是空的。

 static RestMethodInfo getMethodInfo(Map<Method, RestMethodInfo> cache, Method method) {
  synchronized (cache) {
   RestMethodInfo methodInfo = cache.get(method);
   if (methodInfo == null) {
    methodInfo = new RestMethodInfo(method);
    cache.put(method, methodInfo);
   }
   return methodInfo;
  }

在getMethodInfo中判断如果相应的映射不存在,就建立这个映射,并如名字所示缓存起来 

  • 如果是同步调用(接口中直接返回数据,不通过Callback或Observe),直接调用invokeRequest 
  • 如果是非同步调用,先通过RequestInterceptorTape记录拦截请求,记录后在后台线程做实际拦截,后面会提到。
  • 如果是Observe请求(RxJava),执行第5步,对RxJava不了解,略过 
  • 如果是Callback形式,交由线程池执行

    接口中的每一个Method有一个对应的RestMethodInfo,关于接口中Annotation信息的处理就都在这里了

    RestMethodInfo

    private enum ResponseType {
      VOID,
      OBSERVABLE,
      OBJECT
    }
    RestMethodInfo(Method method) {
      this.method = method;
      responseType = parseResponseType();
      isSynchronous = (responseType == ResponseType.OBJECT);
      isObservable = (responseType == ResponseType.OBSERVABLE);
    }