okhttp源码解析

1.okhttp源码解析

  流程详解(依赖implementation 'com.squareup.okhttp3:okhttp:3.10.0')

  1.创建OkhttpClient对象(用于发送http请求和读取请求返回的数据,创建方式有两种:构建这模式和普通创建

  ,构建这模式可以自定义Builder,普通创建使用默认的Builder).

  2.创建Call对象:一个call对象表示一次请求,每次交易请求都会产生一个新的Call对象,Call其实是一个接口,

    它的实现类是RealCall对象。创建过程:通过newCall()方法返回一个RealCall对象。

  3.请求交易:okhttp提供了两种请求方式:同步请求和异步请求,同步请求调用call.execute()方法,异步请

    求调用call.enqueue(Callback callback)方法。

    再看两个请求方式之前需要先知道okhttp中的一个重要成员Dispatcher(调度器)。

    3.1.Dispatcher(调度器):Okhttp的任务调度核心类,负责管理同步和异步请求,并且在其内部还维护了一个

      线程池用于执行相应的请求,同时在其内部还维护了两个任务队列:准备执行的任务队列和正在执行的任务

      队列。

    3.2.同步请求call.execute()

       同步请求调用call.execute()方法,在其内部会调用Dispatcher的execute()方法和getResponseWithInterceptor

       Chain(),通过该方法把realcall对象添加到任务队列中(runningSyncCalls.add(call)),然后不管结果如何最后

       会调用Dispatcher的finished方法把该请求从任务队列中移除。

    3.3.异步请求call.enqueue(Callback callback)

        异步请求调用call.enqueue(Callback callback),在其内部会调用dispatcher的equeue(new AsyncCall(respon

        seCallback))方法,该方法会传入一个AsyncCall对象,在dispatcher的enqueue方法内会先判断当前运行中的

        请求数是否小于最大请求数默认最大请求数为64,并同时判断当前运行中的共同主机请求数是否小于设定的

        最大请求数,默认同一主机的请求数量最大值为5,当两者同时成立时,会调用runningAsyncCalls.add(call)

        方法(表示此次请求的call对象存在runningAsyncCalls队列中)和executorService()的execute(call)方法,反

        之就会调用redyAsncCalls.add(call)(表示此次请求的call对象存在readyAsyncCalls队列中,readyAsyncCalls

        表示已准备好并等待执行请求的队列,当有空闲网络请求线程时,会从该队列中取出并执行网络请求),通

        过executorService.execute(call)方法将call对象传入线程池执行,通过源码可知AsyncCall是一个Runnable的

        实现,用来开启一个线程,executorService是dispatcher内部维护的线程池,所以executorService.execute

        (call)方法的作用是通过网络请求线程池执行该线程的run()方法调用AsyncCall的execute()方法,最后在exe

        cute()方法内调用和同步请求时提到的getResponseWithInterceptorChain()方法。

    3.4.getResponseWithInterceptorChain()/拦截器

         这个方法是通过拦截器链对请求数据和返回数据进行处理,内部采用责任链模式,将每一个拦截器对应负

         责的处理任务进行严格分配,最后将交易结果返回并回调到暴露给调用者的接口上。

        根据源码可以看到,最后交给了了RealInterceptorChain(拦截器链类)这个真正的处理类,并调用

        RealInterceptorChain的proceed()方法,在该方法内部会调用拦截器的intercept(next)方法,只有当前拦截器

        的response返回结果时,才会执行下一个拦截器(因此得出结论:下一个拦截器依赖于当前拦截器的返回,

       可以保证拦截器的依次执行。),在拦截器链中执行的结果,在同步请求中会直接在response返回,异步请

       求时会把拦截器链的处理结果通过Callback的onReponse回调给用户。

         这些拦截器包括:

        ①.用户自定义的拦截器

        ②.retryAndFollowUpInterceptor:重试和重定向拦截器,主要负责网络失败重连。

        ③.BridgeInterceptor:主要负责添加交易请求头。

        ④.CacheInterceptor:缓存拦截器,主要负责拦截缓存。

        ⑤.ConnectInterceptor:网络连接拦截器,主要负责正式开启http请求。

        ⑥.CallServerInterceptor:负责发送网络请求和读取网络响应

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值