执行请求时会调用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); }










