OKHTTP简单解析

来源:互联网 发布:太原软件 编辑:程序博客网 时间:2024/05/02 06:11
/**
 * Created by asus on 2016/10/17.
 */

public abstract class BaseCallBack<T> {

    Type mType;
    //下面方法是把T转换为type对象
    static Type getSuperclassParameter(Class<?> subclass){
        Type superclass=subclass.getGenericSuperclass();
        if(superclass instanceof Class){
            throw new RuntimeException("Missing type parameter");

        }
        ParameterizedType parameterized= (ParameterizedType) superclass;
        return $Gson$Types.canonicalize(parameterized.getActualTypeArguments()[0]);
    }
    public BaseCallBack(){
        mType=getSuperclassParameter(getClass());
    }
    public abstract void onRequsetBefore(Request request);


    public abstract void onFailure(Call call, IOException e);

    public abstract void onSuccess( Response response ,T t) ;
    public abstract void onError( Response response,int code,Exception e) ;
}

*****************************************************************************************************************

/**
 * Created by asus on 2016/10/17.
 */

public class OkhttpHelper {
    private static OkHttpClient okHttpClient;
    private Gson gson;
    private Handler handler;

    private OkhttpHelper() {
        //进行实例化
        okHttpClient=new OkHttpClient();
        okHttpClient.newBuilder().connectTimeout(10, TimeUnit.SECONDS)
                .readTimeout(10, TimeUnit.SECONDS)
                .writeTimeout(10, TimeUnit.SECONDS)
        .build();
        gson=new Gson();
        handler=new Handler(Looper.getMainLooper());


    }

    ;

   public static OkhttpHelper getInstance() {
        return new OkhttpHelper();
    }

    //get请求方法
    public void get(String url, BaseCallBack callBack) {

        Request request = buildRequset(url, null, HttpMethodType.GET);
        doRequest(request, callBack);
    }

    //get请求方法
    public void post(String url, Map<String, String> params, BaseCallBack callBack) {
        Request request = buildRequset(url, params, HttpMethodType.GET);
        doRequest(request, callBack);
    }

    //请求方法
    public void doRequest(Request request, final BaseCallBack callBack) {
        callBack.onRequsetBefore(request);
        okHttpClient.newCall(request).enqueue(new Callback() {
            @Override
            public void onFailure(Call call, IOException e) {

                onFailure(call, e);
            }

            @Override
            public void onResponse(Call call, Response response) throws IOException {

                if (response.isSuccessful()) {
                    //得到解析的字符串
                    String resultStr = response.body().string();
                    if (callBack.mType == String.class) {
                        callBack.onSuccess(response, resultStr);
                        callbackSuccess(callBack,response, resultStr);
                    } else {
                        try {
                            Object object = gson.fromJson(resultStr, callBack.mType);
                            callbackSuccess(callBack,response,object);

                        } catch (JsonIOException e) {
                            callBack.onError(response, response.code(), e);
                        }

                    }

                } else {
                    callBack.onError(response, response.code(), null);
                }
            }
        });
    }

    private Request buildRequset(String url, Map<String, String> params, HttpMethodType methodType) {

        Request.Builder builder = new Request.Builder();
        builder.url(url);
        //判断方法类型
        if (methodType == HttpMethodType.GET) {
            builder.get();
        } else if (methodType == HttpMethodType.POST) {
            RequestBody body = bulidFormData(params);
            builder.post(body);
        }
        return builder.build();
    }

    private RequestBody bulidFormData(Map<String, String> params) {
        FormBody.Builder bulider = new FormBody.Builder();
        if (params != null) {

            for (Map.Entry<String, String> entry : params.entrySet()) {
                bulider.add(entry.getKey(), entry.getValue());
            }
        }
        return bulider.build();
    }
    public void callbackSuccess(final BaseCallBack callback, final Response response, final Object object){
        handler.post(new Runnable() {
            @Override
            public void run() {
                callback.onSuccess(response,object);
            }
        });
    }

    enum HttpMethodType {
        GET,
        POST
    }
}

****************************************************************

OkhttpHelper.getInstance().get("http://lib.suning.com/app/redbaby/80000_5.0.0-459.json", new BaseCallBack<MyBean>()

0 0