一个完整封装的 OkHttp3 工具类
import okhttp3.*;
import java.io.File;
import java.io.IOException;
import java.util.Map;
import java.util.concurrent.TimeUnit;
public class OkHttpUtils {
private static final String TAG = "OkHttpUtils";
private static OkHttpUtils mInstance;
private OkHttpClient mOkHttpClient;
private OkHttpUtils() {
mOkHttpClient = new OkHttpClient.Builder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(10, TimeUnit.SECONDS)
.writeTimeout(10, TimeUnit.SECONDS)
.build();
}
/**
* 获取 OkHttpUtils 实例
*/
public static OkHttpUtils getInstance() {
if (mInstance == null) {
synchronized (OkHttpUtils.class) {
if (mInstance == null) {
mInstance = new OkHttpUtils();
}
}
}
return mInstance;
}
/**
* GET 请求
*/
public void get(String url, Map<String, String> params, Callback callback) {
StringBuilder sb = new StringBuilder(url);
if (params != null && !params.isEmpty()) {
sb.append("?");
for (Map.Entry<String, String> entry : params.entrySet()) {
sb.append(entry.getKey()).append("=").append(entry.getValue()).append("&");
}
sb.deleteCharAt(sb.length() - 1);
}
Request request = new Request.Builder()
.get()
.url(sb.toString())
.build();
mOkHttpClient.newCall(request).enqueue(callback);
}
/**
* POST 请求
*/
public void post(String url, Map<String, String> params, Callback callback) {
FormBody.Builder builder = new FormBody.Builder();
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.add(entry.getKey(), entry.getValue());
}
}
Request request = new Request.Builder()
.post(builder.build())
.url(url)
.build();
mOkHttpClient.newCall(request).enqueue(callback);
}
/**
* 上传文件
*/
public void uploadFile(String url, File file, String fileName, Map<String, String> params, Callback callback) {
MultipartBody.Builder builder = new MultipartBody.Builder()
.setType(MultipartBody.FORM)
.addFormDataPart("file", fileName, RequestBody.create(MediaType.parse("application/octet-stream"), file));
if (params != null && !params.isEmpty()) {
for (Map.Entry<String, String> entry : params.entrySet()) {
builder.addFormDataPart(entry.getKey(), entry.getValue());
}
}
Request request = new Request.Builder()
.url(url)
.post(builder.build())
.build();
mOkHttpClient.newCall(request).enqueue(callback);
}
/**
* 下载文件
*/
public void downloadFile(String url, String destDir, String fileName, Callback callback) {
Request request = new Request.Builder()
.url(url)
.build();
mOkHttpClient.newCall(request).enqueue(new Callback() {
@Override
public void onFailure(Call call, IOException e) {
callback.onFailure(call, e);
}
@Override
public void onResponse(Call call, Response response) throws IOException {
File dir = new File(destDir);
if (!dir.exists()) {
dir.mkdirs();
}
File file = new File(dir, fileName);
byte[] buf = new byte[2048];
long total = response.body().contentLength();
long current = 0;
int len;
IOUtils.writeFileFromBytes(file, buf, 0);
while ((len = response.body().byteStream().read(buf)) != -1) {
IOUtils.writeFileFromBytes(file, buf, len);
current += len;
callback.onProgress(total, current);
}
response.body().close();
callback.onSuccess(call, file);
}
});
}
/**
* 封装 Callback,方便调用
*/
public abstract static class Callback<T> implements okhttp3.Callback {
private static final String TAG = "Callback";
@Override
public void onFailure(Call call, IOException e) {
e.printStackTrace();
}
@Override
public void onResponse(Call call, Response response) throws IOException {
if (response.isSuccessful()) {
onSuccess(call, response.body().string());
} else {
onError(call, response.code(), response.body().string());
}
response.close();
}
public abstract void onSuccess(Call call, T data);
public abstract void onError(Call call, int code, String errorMsg);
public abstract void onSuccess(Call call, String response);
public abstract void onFailure(Call call, IOException e);
}
封装网络请求回调接口的抽象类,包含了请求成功、请求失败、请求错误的回调方法。创建一个网络请求时,可以继承该接口并实现具体的回调逻辑,从而实现网络请求的封装。