网络封装框架:Retrofifit 实现原理
Java的代理和注解
https://www.jianshu.com/p/04e60bee2d80
Retrofi2源码解析——动态代理和注解的实战应用
https://www.jianshu.com/p/542ca9eabe2c
android 事件分发,解决由于listview中实时刷新 ,导致子view点击
事件失效
http://www.360doc.com/content/19/0606/20/62778851_840851629.shtml
动态代理和注解的实战应用
代理的三个条件:
共同接口:代理类和被代理类实现相同的接口
真实对象:实现接口,并真正完成某些操作
代理对象:实现接口,对真实对象进行代理,可以在其操作前后执行其他操作
真实对象:实现接口,并真正完成某些操作
代理对象:实现接口,对真实对象进行代理,可以在其操作前后执行其他操作
Proxy.newProxyInstance
getClassLoader InvocationHandler invoke
method.invoke (realDo,args); //真实对象:实现接口,并真正完成某些操作
Action.class.getClassLoader ,
new Class[]{Action.class}
android 事件分发,解决由于listview中实时刷新 ,导致子view点击
事件失效
http://www.360doc.com/content/19/0606/20/62778851_840851629.shtml
dispatchTouchEvent
@Retention
RetentionPolicy.CLASS
AbstractProcessor
@Retention保留期,可取值:
RetentionPolicy.CLASS
@Target注解的作用域,可取值:
ElementType.TYPE
typeElement.getQualifiedName
element.getAnnotation TestAnnotation.class .value
JavaFileObject createSourceFile
Project Structure-> Artifacts
Build
Build | Build Artifacts
.class .java
编译时注解
运行时注解
Retrofi2源码解析——动态代理和注解的实战应用
https://www.jianshu.com/p/542ca9eabe2c
client.newCall request.enqueue
.addConverterFactory gson
.addCallAdapterFactory rxjava
callFactory OkHttpClient
defaultCallAdapterFactory
Converter.Factory converterFactories
ResponseBody
URL QueryMap
Proxy.newProxyInstance service.getClassLoader Class<?>[] {service}
InvocationHandler {
invoke
}
loadServiceMethod OkHttpCall
serviceMethod.calAdapter.adapt()
method ServiceMethod
// 方法的注解
this.methodAnnotations = method.getAnnotations();
// 方法参数类型
this.parameterTypes = method.getGenericParameterTypes();
// 方法参数注解
this.parameterAnnotationsArray = method.getParameterAnnotations();
createCallAdapter
createResponseConverter
// 对方法的注解转换
for (Annotation annotation : methodAnnotations) {
// 比较重要的一个方法,用于将方法的注解提取并对成员变量赋值
parseMethodAnnotation(annotation);
}
parseMethodAnnotation
parameterAnnotationsArray
Annotation
parseParameter p,parameterType,parameterAnnotations
createCallAdapter
Annotation[] annotations
method.getAnnotations
ExecutorCallAdapterFactory.get
parseParameters value
上面的方法主要是对Method的注解进行处理,通过注解来获得该方法的请求方式以及url。接着我们来看下parseParameter()方法:
annotation
Url QueryMap
retrofit.stringConverter
ParameterHandler apply
/ 最终是ToStringConverter对象
Converter<?, String> valueConverter =
retrofit.stringConverter(valueType, annotations);
Converter<?,String>
OkHttpCall<Object> okHttpCall = new OkHttpCall (serviceMethod,args);
calAdapter.adapt okHttpCall
calAdapter.adapt okHttpCall
创建过程讲过,我们会有一个默认的Executor和CallAdapter.Factory,
这两个类在Android平台分别为Platform.MainThreadExecutor和ExecutorCallAdapterFactory。
ExecutorCallAdapterFactory.java:
// 将Executor传入
Executor CallAdapter.factory
get getCallResponseType responseType
adapt ExecutorCallbackCall callbackExecutor,call
call.enqueue
MainThreadExecutor
delegate.enqueue onResponse
callbackExecutor.execute
ExecutorCallAdapterFactory
OkHttpCall enqueue
ServiceMethod enqueue
okhttp3.Call call
call = rawCall;
createRawCall
call.enqueue okhttp3.Callback
onResponse call rawResponse
Response response
toRequestre
handlers[p].apply requestBuilder,args
formBuilder
RequestBuilder.ContentTypeOverridingRequestBody33333