【Android】の基础——OkHttp
来源:互联网 发布:ubuntu卸载程序命令 编辑:程序博客网 时间:2024/06/06 10:01
- OkHttp使用
- 同步方式
- 异步方式
- 拦截器
- 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()。
- AsyncCall继承NamedRunnable,实现了execute()方法(这个方法Runnable的run中被调用):
那么在enqueue(AsyncCall)方法中:
首先如果正在运行的异步请求的数量符合放入runningAsyncCalls队列的要求,那么放入队列,然后将AsyncCall交给线程池;否则,放入readyAsyncCalls队列;
当线程池执行AsyncCall任务时,它的execute()方法会被调用,getResponseWithInterceptorChain()会去获取响应,最后调用Dispatcher的finished()方法 。
finished()方法中与同步请求不同的是,会调用promoteCalls(),遍历等待队列将请求移动到异步运行队列中。
Volley和OkHttp对比
都支持http请求,get、post方法。
Volley
- 适合进行数据量不大,但通信频繁的网络操作。
- 不适合大文件下载。
- 可直接在主线程调用服务端并处理返回结果。
OkHttp
- 支持https。
- callback回来是在线程里面, 不能刷新UI,需要我们手动处理
- 封装比较麻烦。
阅读全文
0 0
- 【Android】の基础——OkHttp
- Android 网络okHttp基础
- Android中OkHttp基础用法
- Android自学历程—手把手教你使用OkHttp(基础篇)
- android http——OkHttp使用详解
- Android——网络通信(OkHttp)
- Android——OKHttp的使用
- Android 网络框架之 OkHttp 基础使用
- OKhttp基础
- Android ——网络请求框架OkHttp使用
- Android学习笔记02——OKHttp网络框架01
- Android框架之路——OKHttp的使用
- android https——okhttp实现https请求
- Android常见问题——找不到HttpClient和okHttp的包
- Android——自定义拦截器实现OKHttp网络请求
- Android——自定义拦截器实现OKHttp网络请求
- Android——MVP+xRecyclerView+Retrofit+OkHttp+RxJava结合应用
- Android——使用OkHttp(含各种请求方法)
- C++风格_头文件
- 23种设计模式
- GreenDao3.2的基本使用入门
- Android电商项目 ExpandableListView(二级列表)实现购物车(高仿淘宝) demo
- java常用设计模式(适配模式)
- 【Android】の基础——OkHttp
- git简单使用
- VS Code 也能预览 Markdown
- Island Perimeter (上)
- Python itchat个人微信账号接口定时发送群消息
- 关于Bootstrap的定制
- Linux下date命令格式化时间格式shell脚本获取指定格式日期
- bootstrap-table显示行号
- Linux_开发注意事项