【Android】の基础——OkHttp
2017-10-21 11:36
141 查看
OkHttp使用
同步方式
异步方式
拦截器
OkHttp请求过程解析
Dispatcher类
同步请求的执行流程
异步请求的执行流程
Volley和OkHttp对比
Volley
OkHttp
runningSyncCalls用于存储同步请求RealCall对象;
runningAsyncCalls队列用于存储进入队列的异步请求AsyncCall对象;
readyAsyncCalls队列用于当runningAsyncCalls的尺寸达到maxRequests参数时(默认64)存储新加的异步请求。
接下来调用OkHttpClient的dispatcher()方法获得Dispatcher对象并调用其executed(RealCall)方法;
然后通过getResponseWithInterceptorChain()方法同步获取响应;
最后调用Dispatcher的finished()方法。
Dispatcher在excuted()的时候只是将同步请求加入到了runningSyncCalls队列。
finished()方法做的是从队列中移除请求,并获得还在运行的请求数量。如果没有在运行的请求,执行idleCallback的run()方法。
然后调用Dispatcher的enqueue(AsyncCall)方法,传入了一个AsyncCall对象。
AsyncCall继承NamedRunnable,实现了execute()方法(这个方法Runnable的run中被调用):
首先调用getResponseWithInterceptorChain()方法获取响应,成功后回调onReponse(),失败回调的onFailure();
最后,调用Dispatcher的finished()。
那么在enqueue(AsyncCall)方法中:
首先如果正在运行的异步请求的数量符合放入runningAsyncCalls队列的要求,那么放入队列,然后将AsyncCall交给线程池;否则,放入readyAsyncCalls队列;
当线程池执行AsyncCall任务时,它的execute()方法会被调用,getResponseWithInterceptorChain()会去获取响应,最后调用Dispatcher的finished()方法 。
finished()方法中与同步请求不同的是,会调用promoteCalls(),遍历等待队列将请求移动到异步运行队列中。
不适合大文件下载。
可直接在主线程调用服务端并处理返回结果。
callback回来是在线程里面, 不能刷新UI,需要我们手动处理
封装比较麻烦。
同步方式
异步方式
拦截器
OkHttp请求过程解析
Dispatcher类
同步请求的执行流程
异步请求的执行流程
Volley和OkHttp对比
Volley
OkHttp
OkHttp使用
同步方式
OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build(); Request request = new Request.Builder().url("http://www.baidu.com") .get().build(); Call call = client.newCall(request); try { Response response = call.execute(); System.out.println(response.body().string()); } catch (IOException e) { e.printStackTrace(); }
异步方式
OkHttpClient client = new OkHttpClient.Builder().readTimeout(5, TimeUnit.SECONDS).build(); Request request = new Request.Builder().url("http://www.baidu.com") .get().build(); Call call = client.newCall(request); call.enqueue(new Callback() { @Override public void onFailure(Call call, IOException e) { System.out.println("Fail"); } @Override public void onResponse(Call call, Response response) throws IOException { System.out.println(response.body().string()); } });
拦截器
OkHttp请求过程解析
Dispatcher类
内部有一个线程池和三个队列,分别是readyAsyncCalls、runningAsyncCalls和runningSyncCalls队列runningSyncCalls用于存储同步请求RealCall对象;
runningAsyncCalls队列用于存储进入队列的异步请求AsyncCall对象;
readyAsyncCalls队列用于当runningAsyncCalls的尺寸达到maxRequests参数时(默认64)存储新加的异步请求。
同步请求的执行流程
excute()方法中,先判断是否执行过,如果执行过抛出异常并excuted=true;接下来调用OkHttpClient的dispatcher()方法获得Dispatcher对象并调用其executed(RealCall)方法;
然后通过getResponseWithInterceptorChain()方法同步获取响应;
最后调用Dispatcher的finished()方法。
Dispatcher在excuted()的时候只是将同步请求加入到了runningSyncCalls队列。
finished()方法做的是从队列中移除请求,并获得还在运行的请求数量。如果没有在运行的请求,执行idleCallback的run()方法。
异步请求的执行流程
enqueue()方法同样先将executed参数设为true然后调用Dispatcher的enqueue(AsyncCall)方法,传入了一个AsyncCall对象。
AsyncCall继承NamedRunnable,实现了execute()方法(这个方法Runnable的run中被调用):
首先调用getResponseWithInterceptorChain()方法获取响应,成功后回调onReponse(),失败回调的onFailure();
最后,调用Dispatcher的finished()。
那么在enqueue(AsyncCall)方法中:
首先如果正在运行的异步请求的数量符合放入runningAsyncCalls队列的要求,那么放入队列,然后将AsyncCall交给线程池;否则,放入readyAsyncCalls队列;
当线程池执行AsyncCall任务时,它的execute()方法会被调用,getResponseWithInterceptorChain()会去获取响应,最后调用Dispatcher的finished()方法 。
finished()方法中与同步请求不同的是,会调用promoteCalls(),遍历等待队列将请求移动到异步运行队列中。
Volley和OkHttp对比
都支持http请求,get、post方法。Volley
适合进行数据量不大,但通信频繁的网络操作。不适合大文件下载。
可直接在主线程调用服务端并处理返回结果。
OkHttp
支持https。callback回来是在线程里面, 不能刷新UI,需要我们手动处理
封装比较麻烦。
相关文章推荐
- Android网络编程(五)OkHttp2.x用法全解析
- Android基础之HTTP操作及SOCKET网络操作
- Android---HttpURLConnection基础
- android-async-http框架库使用基础
- Android--第三方控件--okHttp
- Android网络编程(六)OkHttp3用法全解析
- 0912Android基础网络技术之Http协议访问网络
- Java基础知识强化之网络编程笔记18:Android网络通信之 使用HttpClient的Post / Get 方式读取网络数据(基于HTTP通信技术)
- Android Https相关解析与okhttp
- Android客户端加载网站验证码(okHttp Jsoup)
- Android获取Cookies,持久化PHPSESSID (OkHttp ;HttpClient ;Afinal)
- Android中进行基于HTTP协议的网络访问基础
- 我的 Android 学习笔记-okhttp 的使用(译)
- Android开发笔记—Http通信的基础使用
- (OK) http://www.android-x86.org - cm-13.0-x86 - download
- Android 订单管理,查询,修改,MVP,OkHttp3的二次封装,
- Android OkHttpClient
- Android下载OKHTTP
- android基础学习之http协议网络请求基本实例
- Android开发-基础网络组件(1)使用HttpURLConnection登陆-注意打开网络需要在线程中执行-主线程不支持