简单的封装okhttp

来源:互联网 发布:广东开放大学网络 编辑:程序博客网 时间:2024/05/16 15:53

由于公司的项目需要上传文件,利用阿里的oss存储,整个过程比较麻烦。对于网络访问就简单的用okhttp封装了一些需要的方法,比较简单。
主要从ok的两点入手,一是ok获取网络结果是在子线程,无法直接更新比较麻烦,另外就是参数将结果解析。
直接上代码
创建httpmanager类,官方文档都说了最好使用单例,所以我们也就不对着干了。
官网地址:http://square.github.io/okhttp/
此处需要注意在2.x版本时,时间时间等设置与3.x版本不一样,如果还像2.x版本设置是没有效果的差异如下:

          //创建OkHttpClient的实例// okHttpClient = new OkHttpClient();  2.0版本构建类的模式okHttpClient = new OkHttpClient.Builder()//3.x版本构建类的模式                .readTimeout(30, TimeUnit.SECONDS)                .connectTimeout(30, TimeUnit.SECONDS)               /* .readTimeout(1, TimeUnit.MINUTES)                .connectTimeout(1, TimeUnit.MINUTES)*/                .build();//3.0后最新编辑模式

整体上就不说了直接贴上代码:

public class HttpManager {    private static HttpManager mHttpManager;//    private final OkHttpClient okHttpClient;    private final Gson gson;    private final Handler handler;    private static final MediaType JSON = MediaType.parse("application/json; charset=utf-8");//post请求编码    private final OkHttpClient okHttpClient;    private String mNppcodes="abcd";    public HttpManager() {        //创建OkHttpClient的实例//        okHttpClient = new OkHttpClient();  2.0版本构建类的模式        okHttpClient = new OkHttpClient.Builder()//3.x版本构建类的模式                .readTimeout(30, TimeUnit.SECONDS)                .connectTimeout(30, TimeUnit.SECONDS)               /* .readTimeout(1, TimeUnit.MINUTES)                .connectTimeout(1, TimeUnit.MINUTES)*/                .build();//3.0后最新编辑模式        //解析JSON        gson = new Gson();        //子线程中更新Ui用到Handler        handler = new Handler(Looper.getMainLooper());    }    //单例    public static HttpManager getHttpManager() {        if (mHttpManager == null) {            synchronized (HttpManager.class) {                if (mHttpManager == null) {                    mHttpManager=new HttpManager();                }            }        }        return mHttpManager;    }    /**     * get请求     * @param url     * @param baseCallBack     */    public void get(String url,BaseCallBack baseCallBack,String token){        Request request=buildRequest(url, RequestTyep.GET,token);        doRequest(request,baseCallBack);    }    /**     * post请求     * @param url     * @param baseCallBack     */    public void postJson(String url,Object json ,String token,BaseCallBack baseCallBack){        Gson gson = new Gson();        String gsonString = gson.toJson(json);        Request.Builder build=new Request.Builder();                build                .post(buildRequestJsonBody(gsonString))                .url(url)                .addHeader("C_AT_",token)                .addHeader("nppCode",mNppcodes);        Request request = build.build();        doRequest(request,baseCallBack);    }/** 并且返回时间差* */    public void postJsonAndGet(String url, Object json , String token, BaseCallBack baseCallBack, Context context){        Gson gson = new Gson();        String gsonString = gson.toJson(json);        Request.Builder build=new Request.Builder();                build                .post(buildRequestJsonBody(gsonString))                .url(url)                .addHeader("C_AT_",token)                .addHeader("nppCode",mNppcodes);        Request request = build.build();        doRequestForgettime(request,baseCallBack,context);    }    /*同步post请求    * */    public String executepostJson(String url,String json ,String token)  {        Request.Builder build=new Request.Builder();        build.post(buildRequestJsonBody(json))                .url(url)                .addHeader("C_AT_",token)                .addHeader("nppCode",mNppcodes);        Request request = build.build();        return doExecuteRequest(request);    }/** * postJson的body */    private RequestBody buildRequestJsonBody(String json) {        RequestBody body = RequestBody.create(JSON,json);        return body;    }    /**     * 创建Request//请求头也可以分装在此     * @return     */    private Request buildRequest(String url, RequestTyep type, String token) {        Request.Builder build=new Request.Builder();        if (type== RequestTyep.GET){            build.get();        }else if (type== RequestTyep.POST){            build.post(buildRequestBody());        }        build.url(url)            .addHeader("C_AT_",token);        return build.build();    }    /**     * 创建post请求体     * @return     */    private RequestBody buildRequestBody() {        FormBody.Builder builder=new FormBody.Builder();        return builder.build();    }    /**     * 请求类型     */    enum RequestTyep{        GET,        POST,        POSTJSON    }    private String doExecuteRequest(Request request) {        Response response = null;        try {            response = okHttpClient.newCall(request).execute();            if (response.isSuccessful()) {                String string = response.body().string();                return string;            } else {                LogUtils.wyjlog("false");                return "";            }        } catch (IOException e) {            e.printStackTrace();            return "";        }    }    /**     * okHttp post同步请求     */    private String  executePost (String url,String json) {        try {            Gson gson = new Gson();            String gsonString = gson.toJson(json);            Request.Builder build=new Request.Builder();            build .post(buildRequestJsonBody(gsonString))                    .url(url).addHeader("C_AT_",token)                    .addHeader("nppCode",mNppcodes);            Request request = build.build();            final Call call = okHttpClient.newCall(request);//创建一个Call            Response response = call.execute(); //执行请求            if (response.isSuccessful()) { //请求执行成功                LogUtils.wyjlog("response ----->" + response.body().string());                return response.body().string();            } else {                return "";            }        } catch (Exception e) {            return "";        }    }    private void doRequest(Request request, final BaseCallBack baseCallBack){//        okHttpClient.newCall().execute();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                senFailure(baseCallBack,call, e,"未连接上服务器"+e.getMessage());            }            @Override            public void onResponse(Call call, Response response) throws IOException {                boolean successful = response.isSuccessful();                if (successful){                    String json = response.body().string();                    sendSuccess(baseCallBack,call,json);                }else {                    int code=response.code();                    ResponseBody body = response.body();                    String string = body.string();                    senFailure(baseCallBack,call,null,code+"----"+string);                }            }        });    }    private void doRequestForgettime(Request request, final BaseCallBack baseCallBack, final Context context){//        okHttpClient.newCall().execute();        okHttpClient.newCall(request).enqueue(new Callback() {            @Override            public void onFailure(Call call, IOException e) {                senFailure(baseCallBack,call, e,"未连接上服务器"+e.getMessage());            }            @Override            public void onResponse(Call call, Response response) throws IOException {                boolean successful = response.isSuccessful();                Headers headers = response.headers();                long clientTime = getDeltaBetweenServerAndClientTime(headers);//utc时间显示                LogUtils.wyjlog("clientTime"+clientTime);                SpUtils.saveString(context, SpConstant.TIMEESCAPE,clientTime+"");                if (successful){                    String json = response.body().string();                    sendSuccess(baseCallBack,call,json);                }else {                    int code=response.code();                    ResponseBody body = response.body();                    String string = body.string();                    senFailure(baseCallBack,call,null,code+"----"+string);                }            }        });    }    /**     * 获取差值     **/    private long getDeltaBetweenServerAndClientTime(Headers headers) {        long deltaBetweenServerAndClientTime=0;        if (headers!=null) {            final String strServerDate = headers.get("Date");            if (!TextUtils.isEmpty(strServerDate)){//                final SimpleDateFormat simpleDateFormat = new SimpleDateFormat("EEE, d MMM yyyy HH:mm:ss 'GMT'", Locale.CHINA);                final SimpleDateFormat simpleDateFormat =new SimpleDateFormat("EEE, dd MMM yyyy HH:mm:ss 'GMT'", Locale.ENGLISH);                TimeZone.setDefault(TimeZone.getTimeZone("GMT+8"));                try {                    Date serverDate  = simpleDateFormat.parse(strServerDate);                    deltaBetweenServerAndClientTime = serverDate.getTime()-new Date().getTime()+8*60*60*1000;                } catch (ParseException e) {                    e.printStackTrace();                }            }        }        return deltaBetweenServerAndClientTime;    }    /**     * 请求成功的处理     * @param baseCallBack     * @param call     * @param json     */    private void sendSuccess(final BaseCallBack baseCallBack, final Call call, final String json) {        handler.post(new Runnable() {            @Override            public void run() {                if (baseCallBack.type==String.class){                    try {                        baseCallBack.onSuccess(call,json);                    } catch (Exception e) {                        e.printStackTrace();                    }                }else {                    Object object = gson.fromJson(json, baseCallBack.type);                    try {                        baseCallBack.onSuccess(call,object);                    } catch (Exception e) {                        e.printStackTrace();                    }                }            }        });    }    /**     * 请求失败的处理     * @param baseCallBack     * @param call     *     */    private void senFailure(final BaseCallBack baseCallBack, final Call call, final IOException e, final String code) {        handler.post(new Runnable() {            @Override            public void run() {                baseCallBack.onFailure(call,e);                LogUtils.wyjlog("网络请求状态:"+code);            }        });    }}

然后根据更新的需求:在主线程中更新,创建了一个BaseCallBack抽象类:

/** * @创建者 wyj * @创建时间 2017/4/514:09. * @描述  回调 * @更新者 ${author} * @更新时间 2017/4/514:09. */public abstract class BaseCallBack<T>  {    Type type;    static Type getSuperclassTypeParameter(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()    {        type = getSuperclassTypeParameter(getClass());    }    public abstract void onFailure(Call call, IOException e);    public abstract void onSuccess(Call call, T t) throws Exception;}

还有些其他的用法可参看文章:
http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2015/0106/2275.html