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

2019-06-03  本文已影响0人  崽子猪

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
常量 常量
上一篇下一篇

猜你喜欢

热点阅读