一个完整封装的 OkHttp3 工具类

一个完整封装的 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);

}

封装网络请求回调接口的抽象类,包含了请求成功、请求失败、请求错误的回调方法。创建一个网络请求时,可以继承该接口并实现具体的回调逻辑,从而实现网络请求的封装。

猜你喜欢

转载自blog.csdn.net/ck3345143/article/details/130357747