okhttp异步请求:AsyncCall、线程池、双向队列

1.创建一个 OkHttpClient ---> new OkHttpClient();

2.创建一个 Request对象 ---> new Request.Builder();

3.创建一个Response对象(表示一个被执行的请求) ---> client.newCall(request) ---> 执行异步请求call.enqueue();

onFailure() 和 onResponse()都是在子线程中完成的,当你要更新UI视图的时候需要切换到主线程完成

ok异步请求流程图

---> enqueue(new Callback) Call请求是个接口去找他的实现类RealCall

首先根据synchronized(this)锁住当前RealCall对象,根据executed进行判断,为true的时候表示执行过了然后抛出异常.它的意思是只能执行一次call请求.接着通过传递进来的callBack封装成AsyncCall(response)在构建了这个实现类之后他就调用了client.dispatcher.enqueue(new AsyncCall(responseCallback))这个方法[返回一个dispatcher调度器对象]

实现类enqueue

---> enqueue(new AsyncCall(responseCallback))

我们发起网络请求之后进行if判断(正在运行的异步任务 和 正在调度请求主机的最大数)如果都在最大数里就可以把call请求添加到异步请求队列中,然后调用线程池的execute方法执行.如果不满足就添加到准备就绪的异步请求队列中.

实例里的enqueue



常量


常量
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

友情链接更多精彩内容