Android OkHttp3简介和使用详解
Posted wx62aa9429a5df6
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Android OkHttp3简介和使用详解相关的知识,希望对你有一定的参考价值。
一 、OKHttp简介
OKHttp是一个处理网络请求的开源项目,android 当前最火热网络框架,由移动支付Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。
1、OKHttp优点
支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数。
基于Headers的缓存策略减少重复的网络请求。
拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)。
2、OKHttp的功能
PUT,DELETE,POST,GET等请求
文件的上传下载
加载图片(内部会图片大小自动压缩)
支持请求回调,直接返回对象、对象集合
支持session的保持
二 OkHttp3使用
首先要在AndroidManifest.xml里添加网络权限,如果需要上传或下载文件还需要添加存储卡读写权限:
<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
2.1、get请求
1、异步get请求
public void getAsyncRequest()
//1、创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//通常使用OkHttpClient client = new OkHttpClient.Builder()//里面存在许多默认的配置
//2、创建Request对象,设置一个URL地址,设置请求方式
Request request = new Request.Builder()
.url("http://www.baidu.com")
.get()
.build();
//3、创建一个call对象,参数为request请求对象
Call call = client.newCall(request);
//4、将请求加入调度,重写回调方法
call.enqueue(new Callback()
@Override
public void onFailure(Call call, IOException e)
//请求失败
@Override
public void onResponse(Call call, Response response) throws IOException
//请求成功
if (response.isSuccessful())
runOnUiThread(new Runnable()
@Override
public void run()
);
);
2.1.1、发送一个异步GET请求的4个步骤:
(1)创建OkHttpClient对象
(2)通过Builder模式创建Request对象,参数必须有个url参数,可以通过Request.Builder设置更多的参数比如:header、method等
(3)通过request的对象去构造得到一个Call对象,Call对象有execute()和cancel()等方法。
(4)以异步的方式去执行请求,调用的是call.enqueue,将call加入调度队列,任务执行完成会在Callback中得到结果。
注意事项:
(1)Request.Builder中默认的使用Get请求,所以可以不调用get()方法
(2)无论是同步还是异步请求,接收到Response对象时均在子线程中,其中通过Response对象获取请求结果需要在子线程中完成,我们不能在子线程更新UI,需要借助于 runOnUiThread() 方法或者 Handler 来处理。
(3)onResponse回调有一个参数是response,如果我们想获得返回的是字符串,可以通过response.body().string()获取;如果希望获得返回的二进制字节数组,则调用response.body().bytes();如果你想拿到返回的inputStream,则调response.body().byteStream(),有inputStream我们就可以通过IO的方式写文件。onResponse执行的线程并不是UI线程。
2.1.2、同步GET请求
(同步GET请求和异步GET请求基本一样,不同地方是同步请求调用Call的execute()方法,而异步请求调用call.enqueue()方法)
public void getSyncRequest()
//1、创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//2、创建request对象
Request request = new Request.Builder()
.url("http://www.baidu.com")
.build();
//3、创建call对象
Call call = client.newCall(request);
//4、同步调用会阻塞主线程,这边在子线程进行
new Thread(new Runnable()
@Override
public void run()
try
//同步调用,返回response,会抛出IO异常
Response response = call.execute();
if (response.isSuccessful())
catch (IOException e)
e.printStackTrace();
).start();
2.2、post请求
2.2.1、POST请求提交键值对
public void postAsyncRequest()
//创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
//通过new FormBody()调用build方法创建RequestBody,用add()添加键值对
RequestBody requestBody = new FormBody.Builder()
.add("username","admin")
.add("password","123")
.build();
//设置URL地址,将RequestBody作为post方法的参数传入
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
//创建call对象,参数就是Request请求对象
Call call = client.newCall(request);
//将请求加入调度,重写回调方法
call.enqueue(new Callback()
@Override
public void onFailure(Call call, IOException e)
//请求失败
@Override
public void onResponse(Call call, Response response) throws IOException
//请求成功
if (response.isSuccessful())
runOnUiThread(new Runnable()
@Override
public void run()
);
);
2.2.2、一个异步POST请求提交键值对的5个步骤:
(1)创建OkHttpClient对象。
(2)通过new FormBody()调用build方法,创建一个RequestBody,可以用add添加键值对 ,FormBody 是 RequestBody 的子类。
(3)创建Request对象,设置URL地址,将RequestBody作为post方法的参数传入。
(4)创建一个call对象,参数就是Request请求对象。
(5)请求加入调度,重写回调方法。
4、异步POST请求提交字符串(POST请求提交字符串和POST请求提交键值对非常相似,不同地方主要是RequestBody)
public void postAsyncRequest()
//创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/json; charset=utf-8");
String value = "username:admin;password:123";
//通过RequestBody.create创建RequestBody对象
RequestBody requestBody = RequestBody.create(mediaType,value);
//设置URL地址,将RequestBody作为post方法的参数传入
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
//创建call对象,参数就是Request请求对象
Call call = client.newCall(request);
//将请求加入调度,重写回调方法
call.enqueue(new Callback()
@Override
public void onFailure(Call call, IOException e)
//请求失败
@Override
public void onResponse(Call call, Response response) throws IOException
//请求成功
if (response.isSuccessful())
runOnUiThread(new Runnable()
@Override
public void run()
);
);
2.2.3、异步POST请求上传文件
public void postAsyncRequest()
//创建OkHttpClient对象
OkHttpClient client = new OkHttpClient();
MediaType mediaType = MediaType.parse("application/octet-stream");
File file = new File(Environment.getExternalStorageDirectory(),"1.png");
RequestBody requestBody = RequestBody.create(mediaType,file);
//设置URL地址,将RequestBody作为post方法的参数传入
Request request = new Request.Builder()
.url("http://www.baidu.com")
.post(requestBody)
.build();
//创建call对象,参数就是Request请求对象
Call call = client.newCall(request);
//将请求加入调度,重写回调方法
call.enqueue(new Callback()
@Override
public void onFailure(Call call, IOException e)
//请求失败
@Override
public void onResponse(Call call, Response response) throws IOException
//请求成功
if (response.isSuccessful())
runOnUiThread(new Runnable()
@Override
public void run()
);
);
以上是关于Android OkHttp3简介和使用详解的主要内容,如果未能解决你的问题,请参考以下文章