一 OKHttp简介
OKHttp是一个处理网络请求的开源项目,Android 当前最火热网络框架,由Square公司贡献,用于替代HttpUrlConnection和Apache HttpClient(android API23 6.0里已移除HttpClient)。
OKHttp优点
- 支持HTTP2/SPDY(SPDY是Google开发的基于TCP的传输层协议,用以最小化网络延迟,提升网络速度,优化用户的网络使用体验。)
- socket自动选择最好路线,并支持自动重连,拥有自动维护的socket连接池,减少握手次数,减少了请求延迟,共享Socket,减少对服务器的请求次数。
- 基于Headers的缓存策略减少重复的网络请求。
- 拥有Interceptors轻松处理请求与响应(自动处理GZip压缩)。
OKHttp的功能
- GET,POST等请求
- 文件的上传下载
- 加载图片(内部会图片大小自动压缩)
- 支持请求回调,直接返回对象、对象集合
- 支持session的保持
二 OkHttp3使用
主要介绍 OkHttp3 的 Get 请求、 Post 请求、 上传下载文件 、 上传下载图片等功能 。
添加OkHttp3的依赖
implementation 'com.squareup.okhttp3:okhttp:4.8.0'
添加网络权限
<uses-permission android:name="android.permission.INTERNET"/>
实际开发中基本采用异步请求,故只采用异步方式
1.异步GET请求
//1.创建OkHttpClient对象
OkHttpClient client=new OkHttpClient();
//2.创建Request对象,设置一个url地址,设置请求方式。
Request request = new Request.Builder().url(url).build();
//3.调用newCall方法,异步调度
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Request request, IOException e) {
}
@Override
public void onResponse(Response response) throws IOException {
}
});
以上过程是Okhttp的请求步骤,如果每发一次请求,重写一次上面的过程,是非常不合理的,我们可以对其封装,这里创建一个类,然后封装
import java.util.Map;
import java.util.concurrent.TimeUnit;
import okhttp3.Callback;
import okhttp3.FormBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
public class OkHTTPManger {
private static OkHttpClient okHttpClient=null;
private volatile static OkHTTPManger instance;//防止多个线程同时访问
/**
* 懒汉式加锁单例模式
* @return
*/
public static OkHTTPManger getInstance() {
if (instance == null) {
synchronized (OkHTTPManger.class) {
if (instance == null) {
instance = new OkHTTPManger();
}
}
}
return instance;
}
public OkHTTPManger(){
okHttpClient = new OkHttpClient();
okHttpClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
}
public void getRequest(String url, Callback callback){
Request request=new Request.Builder().url(url).build();
okHttpClient.newCall(request).enqueue(callback);
}
public void postRequest(String url, Map<String,String> params, Callback callback){
FormBody.Builder builder=new FormBody.Builder();
//遍历集合
for (String key : params.keySet()) {
builder.add(key, params.get(key));
}
//创建Request
Request request = new Request.Builder().url(url).post(builder.build()).build();
okHttpClient.newCall(request).enqueue(callback);
}
}
这样我们每次调用这个方法,然后在回调里面处理我们得到的相应就行