1.使用前准备

Android Studio 配置gradle:

 compile 'com.squareup.okhttp3:okhttp:3.2.0'compile 'com.squareup.okio:okio:1.7.0'

添加网络权限:

<uses-permission android:name="android.permission.INTERNET"/>

2.异步GET请求

    private void getAsynHttp() {mOkHttpClient=new OkHttpClient();Request.Builder requestBuilder = new Request.Builder().url("http://www.baidu.com");//可以省略,默认是GET请求requestBuilder.method("GET",null);Request request = requestBuilder.build();Call mcall= mOkHttpClient.newCall(request);mcall.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {if (null != response.cacheResponse()) {String str = response.cacheResponse().toString();Log.i("wangshu", "cache---" + str);} else {response.body().string();String str = response.networkResponse().toString();Log.i("wangshu", "network---" + str);}runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();}});}});
}

2.异步POST请求

OkHttp3异步POST请求和OkHttp2.x有一些差别就是没有FormEncodingBuilder这个类,替代它的是功能更加强大的FormBody:

  private void postAsynHttp() {mOkHttpClient=new OkHttpClient();RequestBody formBody = new FormBody.Builder().add("size", "10").build();Request request = new Request.Builder().url("http://api.1-blog.com/biz/bizserver/article/list.do").post(formBody).build();Call call = mOkHttpClient.newCall(request);call.enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {String str = response.body().string();Log.i("wangshu", str);runOnUiThread(new Runnable() {@Overridepublic void run() {Toast.makeText(getApplicationContext(), "请求成功", Toast.LENGTH_SHORT).show();}});}});}

3.异步上传文件

上传文件本身也是一个POST请求,上一篇没有讲,这里我们补上。首先定义上传文件类型:

public static final MediaType MEDIA_TYPE_MARKDOWN= MediaType.parse("text/x-markdown; charset=utf-8");

将sdcard根目录的wangshu.txt文件上传到服务器上:

private void postAsynFile() {mOkHttpClient=new OkHttpClient();File file = new File("/sdcard/wangshu.txt");Request request = new Request.Builder().url("https://api.github.com/markdown/raw").post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file)).build();mOkHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {Log.i("wangshu",response.body().string());}});}

当然如果想要改为同步的上传文件只要调用 mOkHttpClient.newCall(request).execute()就可以了。
在wangshu.txt文件中有一行字“Android网络编程(六)OkHttp3用法全解析”我们运行程序点击发送文件按钮,最终请求网络返回的结果就是我们txt文件中的内容 :

这里写图片描述

当然不要忘了添加如下权限:

<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

4.异步下载文件

下载文件同样在上一篇没有讲到,实现起来比较简单,在这里下载一张图片,我们得到Response后将流写进我们指定的图片文件中就可以了。

private void downAsynFile() {mOkHttpClient = new OkHttpClient();String url = "https://img-my.csdn.net/uploads/201603/26/1458988468_5804.jpg";Request request = new Request.Builder().url(url).build();mOkHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) {InputStream inputStream = response.body().byteStream();FileOutputStream fileOutputStream = null;try {fileOutputStream = new FileOutputStream(new File("/sdcard/wangshu.jpg"));byte[] buffer = new byte[2048];int len = 0;while ((len = inputStream.read(buffer)) != -1) {fileOutputStream.write(buffer, 0, len);}fileOutputStream.flush();} catch (IOException e) {Log.i("wangshu", "IOException");e.printStackTrace();}Log.d("wangshu", "文件下载成功");}});

}

5.异步上传Multipart文件

这种场景很常用,我们有时会上传文件同时还需要传其他类型的字段,OkHttp3实现起来很简单,需要注意的是没有服务器接收我这个Multipart文件,所以这里只是举个例子,具体的应用还要结合实际工作中对应的服务器。
首先定义上传文件类型:

   private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");private void sendMultipart(){mOkHttpClient = new OkHttpClient();RequestBody requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM).addFormDataPart("title", "wangshu").addFormDataPart("image", "wangshu.jpg",RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/wangshu.jpg"))).build();Request request = new Request.Builder().header("Authorization", "Client-ID " + "...").url("https://api.imgur.com/3/image").post(requestBody).build();mOkHttpClient.newCall(request).enqueue(new Callback() {@Overridepublic void onFailure(Call call, IOException e) {}@Overridepublic void onResponse(Call call, Response response) throws IOException {Log.i("wangshu", response.body().string());}});
}

6.设置超时时间和缓存

和OkHttp2.x有区别的是不能通过OkHttpClient直接设置超时时间和缓存了,而是通过OkHttpClient.Builder来设置,通过builder配置好OkHttpClient后用builder.build()来返回OkHttpClient,所以我们通常不会调用new OkHttpClient()来得到OkHttpClient,而是通过builder.build():

    File sdcache = getExternalCacheDir();int cacheSize = 10 * 1024 * 1024;OkHttpClient.Builder builder = new OkHttpClient.Builder().connectTimeout(15, TimeUnit.SECONDS).writeTimeout(20, TimeUnit.SECONDS).readTimeout(20, TimeUnit.SECONDS).cache(new Cache(sdcache.getAbsoluteFile(), cacheSize));OkHttpClient mOkHttpClient=builder.build();

7.关于取消请求和封装

OkHttpFinal,它目前是基于OkHttp3来进行封装的。链接描述

8.关于源码Demo

github源码下载链接描述

OkHttp3用法全解析相关推荐

  1. OkHttp3源码解析(三)——连接池复用

    OKHttp3源码解析系列 OkHttp3源码解析(一)之请求流程 OkHttp3源码解析(二)--拦截器链和缓存策略 本文基于OkHttp3的3.11.0版本 implementation 'com ...

  2. Android事件总线(一)EventBus3.0用法全解析

    相关文章 Android事件总线(一)EventBus3.0用法全解析 Android事件总线(二)EventBus3.0源码解析 Android事件总线(三)otto用法全解析 Android事件总 ...

  3. Android网络编程5之OkHttp2.x用法全解析

    前言 讲完了Volley,我们接下来看看目前比较火的网络框架OkHttp, 它处理了很多网络疑难杂症:会从很多常用的连接问题中自动恢复.如果您的服务器配置了多个IP地址,当第一个IP连接失败的时候,O ...

  4. 易基因|DNA甲基化方法全解析:方法发展、技术应用、优缺点

    大家好,这是专注表观组学十余年,领跑多组学科研服务的易基因. 2021年03月,<Methods>杂志以"DNA methylation methods: global DNA ...

  5. Glide4用法全解析

    使用准备 添加依赖 implementation 'com.github.bumptech.glide:glide:4.12.0' annotationProcessor 'com.github.bu ...

  6. js中 slice 用法用法全解析

    slice 工作原理 在深入研究一些更高级的用法之前,让我们看一下 slice 方法的基础知识.如MDN文档, slice 是数组上的一个方法,它最多有两个参数: arr.slice([begin[, ...

  7. Android响应式编程(一)RxJava前篇[入门基础]

    1.RxJava概述 ReactiveX与RxJava 在讲到RxJava之前我们首先要了解什么是ReactiveX,因为RxJava是ReactiveX的一种java实现. ReactiveX是Re ...

  8. 响应式编程android,Android响应式编程(一)RxJava[入门基础]

    1.RxJava概述 ReactiveX与RxJava 在讲到RxJava之前我们首先要了解什么是ReactiveX,因为RxJava是ReactiveX的一种java实现. ReactiveX是Re ...

  9. Android应用开发最强原创知识体系(更新至2019.11.21)

    Android应用开发最强原创知识体系 标签: 知识体系 为了方便大家的阅读以及自己的知识体系的建立,特意来写出这个引导文章.以前我是遇到什么写什么,想到什么写什么,从2016年开始我将围绕这个知识体 ...

  10. Android网络编程(一)HTTP协议原理

    相关文章 Android网络编程(一)HTTP协议原理 Android网络编程(二)HttpClient与HttpURLConnection Android网络编程(三)Volley用法全解析 And ...

最新文章

  1. python【Matlibplot绘图库】基本使用(真の能看懂~!)
  2. 【测试】用示波器抓取红外遥控器NEC信号
  3. Spring – Sending E-Mail Via Gmail SMTP Server With MailSender--reference
  4. 使用Spring+Junit4.4进行测试
  5. gc()两分钟了解JDK8默认垃圾收集器(附英文)
  6. 开源数据访问组件Smark.Data 1.7新增功能
  7. 解决克隆clone github 仓库速度过慢的问题
  8. 武汉科技大学城市学院计算机二级考试,湖北省计算机等级考试一年有几次报名...
  9. The Breakpoint will not currently be hit. No executable code associated with this line
  10. 【Java】java 实现 线程交替输出
  11. beeline安装_hive使用beeline配置远程连接
  12. JSON Viewer丨Json格式查看器
  13. JAVA:实现crc校验算法(附完整源码)
  14. VC编程--玩转控件(Windows编程简介)
  15. 【Mac】13个 Mac 必装软件,效率提升700%,堪称神器!
  16. iOS表格,Sheets.framework
  17. 设置OpenWrt连接外网
  18. 在本地如何启动Vue项目
  19. win10无法关机解决方法
  20. datax数据同步问题(mysql2hive)汇总

热门文章

  1. LeetCode Student Attendance Record I
  2. Android ListView上拉获取下一页
  3. 3) Maven 目录结构
  4. 我的大学生活-4-21-吕家尧
  5. toj 4069 简易统计
  6. 【Java学习笔记】数组的相关事项
  7. Create umbraco website-On the road of umbraco (1)
  8. 基于ASP.NET AJAX的WebPart开发与部署
  9. Monotonic Renumeration- codeforce
  10. React-Native集成dva.js