相关文章:
OkHttp源码分析(3)- Dispatcher - 线程资源管理和分配
OkHttp是如何进行网络请求的
由图可知,从call发起异步请求到CallBack回调成功,有三个步骤。
总结:
第一步,创建Request和OkHttpClicent对象,然后将Request封装成Call对象,然后调用enqueue()方法执行异步请求;
第二步,Dispatcher的enqueue(AsyncCall)和promoteAndExecute()方法,enqueue(AsyncCall)有两个作用:一是添加AsyncCall到预执行队列readyAsyncCalls,二是设置同一Host的连接计数器;promoteAndExecute()负责真正对AsyncCall进行资源的调度:对readyAsyncCalls进行迭代循环,如果正在执行的队列size不超过64且同一Host的连接计数器的值不超过5,就将这个请求放入到runningAsyncCalls。然后遍历runningAsyncCalls,挨个执行里面的请求,见下图
第三步,AsyncCall对象把自己作为任务交到线程池执行,提交成功后就finish掉,见下图
具体的代码,暂时不用看:
1.通过Call发起网络请求的准备工作
1.1 通过构造者模式添加 url,method,header,body 等完成一个请求的信息 Request 对象
val request = Request.Builder()
.url("")
.addHeader("","")
.get()
.build()
1.2 同样通过构造者模式创建一个 OkHttpClicent 实例,可以按需配置
val okHttpClient = OkHttpClient.Builder()
.connectTimeout(15, TimeUnit.SECONDS)
.readTimeout(15, TimeUnit.SECONDS)
.addInterceptor()
.build()
1.3 将Request 封装成 Call 对象并且发起网络请求
val call = okHttpClient.newCall(request)
//异步请求数据
call.enqueue(object :Callback{
override fun onFailure(call: Call, e: IOException) {}
override fun onResponse(call: Call, response: Response) {}
})
//同步请求数据
val response = call.execute()
整个使用流程很简单,主要的地方在于如何通过 Call 对象发起同/异步请求,后续的源码追踪以方法开始。