使用的依赖
implementation 'com.squareup.okhttp3:okhttp:3.2.0'
//ok 日志的拦截器
implementation 'com.squareup.okhttp3:logging-interceptor:3.12.0'
别忘了加网络权限
接着看干货代码
/*Time:2019/5/10
*Author:zhaozhiwei
*Description:
*/
public class okHttpUtis {
private String TAG = "AA";
private Handler handler;
OkHttpClient client;
//无参构造必须写
private okHttpUtis() {
initOkHttp();
}
//静态内部类单例
private static class okHPMH {
private static okHttpUtis instance = new okHttpUtis();
}
public static okHttpUtis getInstance() {
return okHPMH.instance;
}
/**
* 初始化okhttp
*/
private void initOkHttp() {
//创建一个handler,用于从子线程把结果返回给主线程
handler = new Handler();
//通过构造者模式,拿到build实例,开始设置参数
OkHttpClient.Builder builder = new OkHttpClient.Builder();
//我们设置一些超时,链接超时,读写超时,不是必要的
//两个参数:1.时间长度 2.时间单位
builder.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(30, TimeUnit.SECONDS)
//添加日志拦截器
.addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY));
client = builder.build();
}
/**
* get请求
*
* @param url
* @param networkCallback
*/
public void doGet(String url, final NetworkCallback networkCallback) {
//首先生成请求
final Request request = new Request.Builder()
.url(url)
.build();
//调用client.newCall方法,把请求当做参数传入
//通过enqueue发起异步请求,添加OKHttp提供的Callback回调的参数
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(final Call call, IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
if (networkCallback != null) {
networkCallback.onFail("error");
}
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//回调的方法执行在子线程。
if (response.isSuccessful()) {
//记住!一定是.string 不然你家就炸了
final String string = response.body().string();
//就可以打印拦截的数据
Log.i(TAG, "获取数据成功了");
Log.i(TAG, "response.code()==" + response.code());
Log.i(TAG, "response.body().string()==" + string);
handler.post(new Runnable() {
@Override
public void run() {
if (networkCallback != null) {
networkCallback.onSuccess(string);
}
}
});
} else {
if (networkCallback != null) {
networkCallback.onFail("");
}
}
}
});
}
//Post请求
public void doPost(String url, Map<String, String> map, final NetworkCallback networkCallback) {
//创建表单请求体
FormBody.Builder builder = new FormBody.Builder();
//遍历map集合,将key,value放入FormBody中
for (Map.Entry<String, String> entry : map.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
//创建request对象
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
client.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
handler.post(new Runnable() {
@Override
public void run() {
if (networkCallback!=null){
networkCallback.onFail("error");
}
}
});
}
@Override
public void onResponse(Call call, Response response) throws IOException {
//回调的方法执行在子线程
if (response.isSuccessful()){
final String s = response.body().string();
handler.post(new Runnable() {
@Override
public void run() {
if (networkCallback!=null){
networkCallback.onSuccess(s);
}
}
});
}else {
if (networkCallback!=null){
networkCallback.onFail("");
}
}
}
});
}
//接口回调
public interface NetworkCallback {
void onSuccess(String str);
void onFail(String str);
}
}
哪里用到直接调就行