网络封装框架:Retrofifit 实现原理

网络封装框架: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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值