OkHttp相关问题全解析,2021新鲜出炉阿里巴巴面试真题

本文详细探讨了OkHttp的内部机制,包括Dispatcher的线程池管理,Interceptor的责任链模式,以及HTTP缓存的原理和OkHttp的实现。着重分析了各个拦截器的功能,如RetryAndFollowUpInterceptor、BridgeInterceptor、CacheInterceptor和ConnectInterceptor。同时,解释了应用拦截器和网络拦截器的区别,以及如何在OkHttp中启用和使用缓存。
摘要由CSDN通过智能技术生成

i.remove()

//per host 计数加1

asyncCall.callsPerHost().incrementAndGet()

executableCalls.add(asyncCall)

//移入runningAsyncCalls列表

runningAsyncCalls.add(asyncCall)

}

isRunning = runningCallsCount() > 0

}

for (i in 0 until executableCalls.size) {

val asyncCall = executableCalls[i]

//提交任务到线程池

asyncCall.executeOn(executorService)

}

return isRunning

}

这个方法在enqueue和finish方法中都会调用,即当有新的请求入队和当前请求完成后,需要重新提交一遍任务到线程池。

讲了半天线程池,那OkHttp内部到底用的什么线程池呢?

#Dispatcher

@get:JvmName(“executorService”) val executorService: ExecutorService

get() {

if (executorServiceOrNull == null) {

executorServiceOrNull = ThreadPoolExecutor(0, Int.MAX_VALUE, 60, TimeUnit.SECONDS,

SynchronousQueue(), threadFactory(“OkHttp Dispatcher”, false))

}

return executorServiceOrNull!!

}

这不是一个newCachedThreadPool吗?没错,除了最后一个threadFactory参数之外与newCachedThreadPool一毛一样,只不过是设置了线程名字而已,用于排查问题。

阻塞队列用的SynchronousQueue,它的特点是不存储数据,当添加一个元素时,必须等待一个消费线程取出它,否则一直阻塞,如果当前有空闲线程则直接在这个空闲线程执行,如果没有则新启动一个线程执行任务。通常用于需要快速响应任务的场景,在网络请求要求低延迟的大背景下比较合适,详见旧文 Java线程池工作原理浅析

继续回到主线,第二步比较复杂我们先跳过,来看第三步。

第三步

调用Dispatcher的finished方法

//异步任务执行结束

internal fun finished(call: AsyncCall) {

call.callsPerHost().decrementAndGet()

finished(runningAsyncCalls, call)

}

//同步任务执行结束

internal fun finished(call: RealCall) {

finished(runningSyncCalls, call)

}

//同步异步任务 统一汇总到这里

private fun finished(calls: Deque, call: T) {

val idleCallback: Runnable?

synchronized(this) {

//将完成的任务从队列中删除

if (!calls.remove(call)) throw AssertionError(“Call wasn’t in-flight!”)

idleCallback = this.idleCallback

}

//这个方法在第一步中已经分析,用于将等待队列中的请求移入异步队列,并交由线程池执行。

val isRunning = promoteAndExecute()

//如果没有请求需要执行,回调闲置callback

if (!isRunning && idleCallback != null) {

idleCallback.run()

}

}

第二步

现在我们回过头来看最复杂的第二步,调用getResponseWithInterceptorChain方法,这也是整个OkHttp实现责任链模式的核心。

#RealCall

fun getResponseWithInterceptorChain(): Response {

//创建

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值