OkHttp封装

import com.google.gson.Gson;
import com.google.gson.internal.$Gson$Types;


import java.io.File;
import java.io.IOException;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.Map;


import okhttp3.Call;
import okhttp3.Callback;
import okhttp3.MediaType;
import okhttp3.MultipartBody;
import okhttp3.OkHttpClient;
import okhttp3.Request;
import okhttp3.RequestBody;
import okhttp3.Response;


/**
 * Created by 苏照亮 on 2017/10/25.
 */


public class OkHttpManager {


    private static OkHttpManager okHttpManager;
    private OkHttpClient okHttpClient;
    private ResultCallback resultCallBack;
    private Gson gson;


    private OkHttpManager() {
        OkHttpClient.Builder builder = new OkHttpClient.Builder();
        okHttpClient = builder.build();
        gson = new Gson();
    }


    public static OkHttpManager getIntance() {
        if (okHttpManager == null) {
            synchronized (OkHttpManager.class) {
                if (okHttpManager == null) {
                    okHttpManager = new OkHttpManager();
                }
            }
        }
        return okHttpManager;
    }


    public void request(String url, Map<String, Object> params, ResultCallback callBack) {


        this.resultCallBack = callBack;


        Request request;
        if (params == null || params.size() == 0) {
            request = new Request.Builder().url(url).get().build();
        } else {
            MultipartBody.Builder multipartBody = new MultipartBody.Builder();
            multipartBody.setType(MultipartBody.FORM);
            for (Map.Entry<String, Object> stringObjectEntry : params.entrySet()) {
                if (stringObjectEntry.getValue() instanceof File) {
                    File file = (File) stringObjectEntry.getValue();
                    multipartBody.addFormDataPart(stringObjectEntry.getKey(),
                            file.getName(), RequestBody.create(MediaType.parse("image/*"), file));
                } else {
                    multipartBody.addFormDataPart(stringObjectEntry.getKey(), (String) stringObjectEntry.getValue());
                }
            }
            MultipartBody build = multipartBody.build();
            request = new Request.Builder().url(url).post(build).build();
        }


        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {
                resultCallBack.onFailure(call, e);
            }


            @Override
            public void onResponse(Call call, Response response) throws IOException {
                if (response.isSuccessful()) {
                    String json = response.body().string();
                    resultCallBack.onResponse(call, gson.fromJson(json,resultCallBack.mType), json);
                }
            }
        });


    }


    public static abstract class ResultCallback<T>
    {
        Type mType;


        public ResultCallback()
        {
            mType = getSuperclassTypeParameter(getClass());
        }


        static Type getSuperclassTypeParameter(Class<?> subclass)
        {
            //通过反射得到泛型参数
            //Type是 Java 编程语言中所有类型的公共高级接口。它们包括原始类型、参数化类型、数组类型、类型变量和基本类型。
            Type superclass = subclass.getGenericSuperclass();
            if (superclass instanceof Class)
            {
                throw new RuntimeException("Missing type parameter.");
            }
            //ParameterizedType参数化类型,即泛型
            ParameterizedType parameterized = (ParameterizedType) superclass;
            //getActualTypeArguments获取参数化类型的数组,泛型可能有多个
            //将Java 中的Type实现,转化为自己内部的数据实现,得到gson解析需要的泛型
            return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
        }


        public abstract void onFailure(Call call, IOException e);
        public abstract void onResponse(Call call,T response,String json);
    }
OkHttp是一个开源的HTTP客户端库,它封装了平台之间的差异性,为我们提供了方便的接口来发送HTTP请求和处理响应。当我们使用OkHttp时,可以使用封装类来简化使用过程。 OkHttp封装类主要包括以下几个方面: 1. 初始化OkHttpClient:首先,我们需要创建一个OkHttpClient对象,用于发送HTTP请求。在封装类中,可以在构造方法中进行OkHttpClient的初始化设置,比如设置超时时间、添加拦截器等。 2. 发送GET请求:通过封装类,我们可以定义一个方法来发送GET请求。该方法接收一个URL作为参数,使用OkHttpClient来创建一个Request对象,并通过该对象发送异步的GET请求。在回调中处理服务器响应结果,并返回给调用者。 3. 发送POST请求:类似于GET请求,我们可以封装一个方法来发送POST请求。该方法接收一个URL和需要发送的数据作为参数,使用OkHttpClient创建一个RequestBody对象,并通过该对象发送异步的POST请求。同样,在回调中处理响应结果,并返回给调用者。 4. 添加请求头:在某些情况下,我们可能需要添加请求头来发送自定义的信息。封装类可以提供一个方法,接收一个字符串类型的键值对参数,用于添加自定义的请求头。 5. 异步请求:OkHttp的请求是异步执行的,默认情况下在子线程中发送请求并在主线程中处理结果。封装类可以将异步请求的结果通过回调的方式返回给调用者,方便处理响应结果。 通过封装类,我们可以将OkHttp的使用变得更简单、更便捷。可以将一些通用的处理逻辑提取出来,在封装类中进行统一处理,并对外提供更友好的接口。这样可以减少代码的重复性,提高开发效率。同时,封装类还可以对请求进行统一的异常处理、日志打印等操作,方便排查问题和调试。总之,OkHttp封装类可以让我们更好地利用OkHttp的强大功能,提升开发效率和代码可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值