okhttp的口碑还是相当的好的。加上Google貌似在6.0版本里面删除了HttpClient相关API,为了更好的在应对网络访问,okhttp还是挺重要的.
//数据请求是否成功监听
public interface LoadNetDataListener {
//数据加载成功
void loadNetDataSuccess(String string);
//数据加载失败
void loadNetDataFailed(String string);
}
public class OkHttp3Utils {
private MyHandler myHandler = new MyHandler();
private static OkHttpClient okHttpClient = null;
private LoadNetDataListener loadNetDataListener;
private static OkHttpClient getOkHttpClient() {
synchronized (OkHttp3Utils.class) {
if (okHttpClient == null) {
okHttpClient = new OkHttpClient();
}
}
return okHttpClient;
}
//上传文件
public static void loadFile(String url, File file, String fileName) {
OkHttpClient okHttpClient = getOkHttpClient();
//设置文件类型
RequestBody requestBody = RequestBody.create(MediaType.parse("application/octet-stream"), file);
//设置请求体
RequestBody body = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("image", fileName, requestBody)
.build();
//请求方式
Request request = new Request.Builder().url(url).post(body).build();
okHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
@Override
public void onResponse(Call call, Response response) throws IOException {
}
});
}
/**
* 1.接口地址
* 2.接口回调
*/
public void doGet(String url) {
OkHttpClient okHttpClient = getOkHttpClient();
Request request = new Request.Builder().url(url).build();
Call call = okHttpClient.newCall(request);
call.enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
}
//这个onResponse执行的线程并不是UI线程。是的,如果你希望操作控件,还是需要使用handler等
@Override
public void onResponse(Call call, Response response) throws IOException {
String string = response.body().string();
Message message = myHandler.obtainMessage();
message.what = 1;
message.obj = string;
myHandler.sendMessage(message);
}
});
}
/**
* 1.地址
* 2.接口回调
* 3.请求体
*/
public void doPost(String url, Map<String, String> map, Callback callback) {
OkHttpClient okHttpClient = getOkHttpClient();
FormBody.Builder builder = new FormBody.Builder();
//遍历map集合 设置请求体
for (String mapKey : map.keySet()) {
builder.add(mapKey, map.get(mapKey));
}
//设置请求方式
Request request = new Request.Builder().url(url).post(builder.build()).build();
//执行请求方式 接口回调
okHttpClient.newCall(request).enqueue(callback);
}
/**
* 1.下载地址
*/
public static void doDown(String url, Callback callback) {
OkHttpClient okHttpClient = getOkHttpClient();
Request build = new Request.Builder().url(url).build();
okHttpClient.newCall(build).enqueue(callback);
}
//创建我的Handler
class MyHandler extends Handler {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case 0:
//请求失败
loadNetDataListener.loadNetDataSuccess("网络打小差了");
break;
case 1:
//请求成功
String json = (String) msg.obj;
loadNetDataListener.loadNetDataSuccess(json);
break;
}
}
}
//给外部调用的方法
public void setOnOKHttpGetListener(LoadNetDataListener loadNetDataListener) {
this.loadNetDataListener = loadNetDataListener;
}
}