美文网首页
Android Retrofit的源码解读

Android Retrofit的源码解读

作者: liyihuanx | 来源:发表于2021-10-20 23:49 被阅读0次

    先提出几个问题,然后本片文章就根据下面几个问题做源码的解读。

    1.整个请求的流程是怎样的?
    2.底层是如何用 OkHttp 请求的?
    3.Okhttp是异步的,retrofit是怎么帮我们切换到主线程的
    4.注解是什么时候解析的,怎么解析的?
    5.Converter和CallAdapter的作用
    6.如何支持 Kotlin协程的suspend挂起函数的?

    Retrofit的简单流程图

    image.png

    接下来就根据流程图进入,首先是Retrofit.build()

    image.png

    重点1

    因为我们一般都不会传入callbackExecutor(回调执行器),所以他会进入到platform.defaultCallbackExecutor()语句
    但是我们直接点进去看的话,会发现,啥也没有

    image.png

    那就先从platform入手吧,进入之后能看到
    (其实英语也知道platform就是平台的意思,这里就是做一个平台的区分)


    image.png

    接着再进入Android()


    image.png

    所以这里可以认为callbackExecutor == MainThreadExecutor,用来切换线程

    重点2

    可以看到上一步拿到的callbackExecutor 作为参数传入了platform.defaultCallAdapterFactories(callbackExecutor),进入看到

    image.png

    接着进入DefaultCallAdapterFactory

    image.png

    在进入ExecutorCallbackCall

    image.png

    这就是发起网络请求后,Retrofit帮我们切换到主线程的流程,总得来说就是在build方法中,通过Platform的子类Android()添加了一个默认的Executor:MainThreadExecutor,然后还添加了一个DefaultCallAdapterFactory并创建了匿名内部类CallAdapterMainThreadExecutor,包装成ExecutorCallbackCall,在网络请求回调,通过它切换线程,并把结果抛出去

    重点3

    image.png

    如果你没添加ConverterFacTory的话,默认会通过这个转换数据,你也可以通过继承Converter.FacTory自定义自己的数据转换。Gson的就是这样做的。

    接着Retrofit.create()

    这个方法看起来很简单就是通过动态代理获取interface的实例,接着你就可以调用方法了
    当我们通过实例调用方法时,就会进入InvocationHandler.invoke,重点在这里面

    image.png

    先进入到看一看ServiceMethod

    进入loadServiceMethod
    方法很简单,就是先从自己保存的中查找,没有则生成再保存下来,以后可以复用。

    image.png image.png

    先看一下RequestFactory,里面都是方法注解的处理。需要注意的是对kotlin协程的适配

    在RequestFactory的build方法中,会遍历所有参数,去解析他们

    image.png

    在跟进到parseParameter,我们知道kotlin在编译时候,会给方法最后后面添加一个Continuation<T>的参数,

    image.png

    而这个标志位会保存在requestFactory然后传入HttpServiceMethod
    !!这里写错了,这里responseType应该是Continuation里面的泛型<T>!!

    image.png image.png

    1.先看第一个,普通方法进入的CallAdapted
    写错了,应该是loadServiceMethod(method).invoke()调用的

    image.png image.png

    2.当是一个suspend方法时

    image.png image.png

    interface.enqueue

    在调用apiService.getHttp() 接口的方法
    其实就是在调用 --> InvocationHan.invoke()
    最终就是 --> return loadServiceMethod(method).invoke()
    在跟进代码之后,


    image.png

    所以又回到了DafalutCallAdapterFactory


    image.png

    看到OkHttpCall的方法


    image.png

    这是真正的创建OkHttp的Call


    image.png

    拿到Okhttp的call后就可以网络请求了


    image.png

    这样通过三步的分析,就能把整个Retrofit流程给串联起来了

    相关文章

      网友评论

          本文标题:Android Retrofit的源码解读

          本文链接:https://www.haomeiwen.com/subject/wjvtaltx.html