Android内置的OkHttp用法介绍
作者:m0_63970488 发布时间:2021-11-29 01:00:53
Okhttp 处理了很多网络疑难杂症,比如从很多常用的连接问题中自动恢复。如果你服务器配置了多个IP地址,当一个IP地址连接失败后Okhttp会自动尝试下一个IP,从Android4.4版本后,系统内置了Okhttp,可见Okhttp功能的强大。
远程依赖添加,okio作为Okhttp的IO组件,也是必须要引入的。
api 'com.squareup.okhttp3:okhttp:3.12.13'
api 'com.squareup.okio:okio:2.8.0'
1.异步GET请求
Request.Builder url = new Request.Builder().url("");
url.method("GET", null);
Request build = url.build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
}
});
其基本步骤就是创建OkhttpClient、Request、和Call,最后调用Call的enqueue方法,需要注意的是onResponse回调并非在UI线程中,如果想要同步GET请求,则可以调用Call的execute方法。
2.异步POST请求
Okhttp3的异步POST请求和okhttp2的异步POST请求有一些差别,就是没有FormEncodingBuilder这个类,替代它的是功能强大的FormBody。
RequestBody formBody = new FormBody.Builder()
.add("ip", "59.108.54.37")
.build();
Request build = new Request.Builder()
.url("")
.post(formBody)
.build();
OkHttpClient okHttpClient = new OkHttpClient();
Call call = okHttpClient.newCall(build);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
这与异步GET请求类似,只是多了FormBody来封装请求参数,并传递给Request
3.异步上传文件
上传文件本身也是一个POST请求,首先定义上传的文件类型。
public static final MediaType MEDIA_TYPE_MARKDOWN = MediaType.parse("text/x-markdown; charset=utf-8");
在SD卡的根目录创建一个文件 ,里面内容为OkHttp
String filePath = "";
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
} else {
return;
}
File file = new File(filePath, "test.txt");
Request build = new Request.Builder()
.url("")
.post(RequestBody.create(MEDIA_TYPE_MARKDOWN, file))
.build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(build).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
如果想要改为同步上传文件,只要调用OkhttpClient.newCall(request).execute()就可以了,最终请求返回结构就是我们txt文件中的内容。
4.异步下载文件
下载一张图片,得到Respouse后流写进我们指定的图片文件中,代码如下所示
String url = "";
Request request = new Request.Builder().url(url).build();
OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
InputStream inputStream = response.body().byteStream();
FileOutputStream fileOutputStream = null;
String filePath = "";
try {
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
filePath = Environment.getExternalStorageDirectory().getAbsolutePath();
} else {
filePath = getFilesDir().getAbsolutePath();
}
File file = new File(filePath, "test.jpg");
if (null != file) {
fileOutputStream = new FileOutputStream(file);
byte[] buffer = new byte[2048];
int len = 0;
while ((len = inputStream.read(buffer)) != -1) {
fileOutputStream.write(buffer, 0, len);
}
fileOutputStream.flush();
}
} catch (Exception e) {
e.printStackTrace();
}
}
});
5.异步上传Multipart文件
有时上传文件时,同时还需要上传其他类型的字段。 Okhttp3 实现起来很简单。 需要注意的是没有服务器接受我这个Multipart文件,具体应用还要结合实际工作中对应的服务器
private static final MediaType MEDIA_TYPE_PNG = MediaType.parse("image/png");
public static void send() {
OkHttpClient okHttpClient = new OkHttpClient();
MultipartBody build = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("title", "test") //1
.addFormDataPart("image", "test.jpg", RequestBody.create(MEDIA_TYPE_PNG, new File("/sdcard/test.jpg")))//2
.build();
Request authorization = new Request.Builder()
.header("Authorization", "Client-ID" + "...")
.url("")
.post(build)
.build();
okHttpClient.newCall(authorization).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
上述代码中,注释1处是常见的 key-value(键-值)形式的参数。
注释2处则是上传表单,addFormDataPart方法的第一个参数是key值,第二个参数是上传文件的名字,第三个参数是需要上传的文件。
6.设置超时时间和缓存
和Okhttp2有区别的是Okhttp3不能通过OkhttpClient直接设置超时时间和缓存了,而是通过OkHttpClient.Builder来设置。通过OkHttpClient.Builder配置好OkHttpClient后用builder.build()返回OkHttpClient。我们通常不会调用 new OkhttpClient() 来得到OkhttpClient,而是通过builder.build()得到OkHttpClient。另外OkHttp3支持设置连接,写入和读取超时时间。
File sdcache = new File("");
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 okHttpClient = builder.build();
来源:https://blog.csdn.net/m0_63970488/article/details/125938410


猜你喜欢
- 本文实例为大家分享了基于servlet实现统计网页访问次数的具体代码,供大家参考,具体内容如下一、基础知识(1)ServletContext
- /* * 使用 C# 动态编译代码和执行 * 作者: yaob */ static void Main(string[] args) { /
- 文档更新说明2018年09月24日 v1.0 初稿代理在生活中很常见,比如说婚介网站,其实就是找对象的代理;还有社保代理、人事代理;还有找黄
- C#一些延时函数sleep延时方法System.Threading.Thread.Sleep(1000); //毫秒实现的是非独占性延时函数
- 一,网络编程中两个主要的问题一个是如何准确的定位网络上一台或多台主机,另一个就是找到主机后如何可靠高效的进行数据传输。在TCP/IP协议中I
- 问题:最近在项目中遇到,不同客户机安装不同Office版本,在导出Excel时,发生错误。找不到Excel Com组件,错误信息如下。&nb
- 本文实例讲述了java GUI编程之paint绘制操作。分享给大家供大家参考,具体如下:import java.awt.*;public c
- 本文介绍了Android中js和原生交互的示例代码,分享给大家,具体如下:加载webview的类public class MainActiv
- 前言jdk中提供了许多的并发工具类,大家可能比较熟悉的有CountDownLatch,主要用来阻塞一个线程运行,直到其他线程运行完毕。而jd
- Android Studio Intent隐式启动,发短信,拨号,打电话,访问网页等实例代码功能创建5个按钮,隐式启动、发短信、拨号按钮、电
- 有时候,我们在同一个activity里面有很多fragment,在横竖屏的时候,有些fragment要求重新加载数据,有些不需要,如何简单控
- 最近用到一些字符串加密,而.net中提供的加密算法中用起来比较复杂,便简单的封装了一下,方便日后使用。public class Encryp
- 背景在当下移动互联网后半场,手机已经是人手必备的设备。App是离用户最近的应用,界面又是最直观影响用户体验的关键部分,其流畅度直接影响用户对
- 这篇文章主要介绍了如何通过Java实现时间轴过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友
- 目录一、什么是反射:二、反射的原理:三、反射的优缺点:四、反射的用途:五、反射机制常用的类:六、反射的基本使用:1、获得Class:主要有三
- 译者注:个人觉得用定时任务来跑垃圾回收不是很好的例子,从译者接触到的项目来看,比较常见的是用定时任务来进行非实时计算,清除临时数据、文件等。
- 1、将 Jmeter 下 extras 目录中 ant-jmeter-1.1.1.jar 包拷贝至 ant 安装目录下的lib目录中,否则会
- 在Linux中创建一个新进程的唯一方法是使用fork()函数。fork()函数是Linux中一个非常重要的函数,和以往遇到的函数有一些区别,
- hadoop做的一个简单grep程序,可从文档中提取包含某些字符串的行/* * 一个简单grep程序,可从文档中提取包含莫些字符串
- 本篇文章主要介绍了java自动生成编号的实现,分享给大家,具体如下/** * 自动生成编号格式:yyMM+四位流水号 */ @Reques