OkHttp简单封装,添加泛型

来源:互联网 发布:淘宝卖家中心我要开店 编辑:程序博客网 时间:2024/06/05 14:52

对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;

public class OkHttpManager {


    private final OkHttpClient okHttpClient;
    private ResultCallback mcallBack;
    private final Gson gson;
    private volatile static OkHttpManager okHttpManager;
    private OkHttpManager(){
        okHttpClient = new OkHttpClient();
        gson = new Gson();
    }
    public  static OkHttpManager getInstance(){
        if (okHttpManager == null) {
            synchronized (OkHttpManager.class) {
                if (okHttpManager == null) {
                    okHttpManager = new OkHttpManager();
                }
            }
        }
        return okHttpManager;
    }


    public  void requestAsyn(String url, Map<String,Object> map,ResultCallback callBack){


            this.mcallBack = callBack;
            Request request = null;
            request = getRequest(url, map);
            okHttpClient.newCall(request).enqueue(new Callback() {
                @Override
                public void onFailure(Call call, IOException e) {
                    mcallBack.onFailure(call,e);
                }


                @Override
                public void onResponse(Call call, Response response) throws IOException {
                    String json = response.body().string();


                    mcallBack.onResponse(call,gson.fromJson(json,mcallBack.mType),json);
                }
            });


    }


    private Request getRequest(String url, Map<String, Object> params) {
        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();
        }
        return request;
    }
    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);
    }
}
原创粉丝点击