OKHTTP的单例和再封装

来源:互联网 发布:centos 6.7 安装教程 编辑:程序博客网 时间:2024/06/04 19:55
/** * Created by zm on 16-2-1 * okhttp的再封装,对于2.x版本,3.x版本将原有对okhttpclient配置 * 改成了builder模式配 * 置,对于超时、代理、dns,okhttp已经做好了配置, * 若不需要特殊配置,可以跳过 */public class OkHttpUtil{    private static OkHttpClient singleton;    //非常有必要,要不此类还是可以被new,但是无法避免反射,好恶心    private OkHttpUtil(){    }    public static OkHttpClient getInstance() {        if (singleton == null)        {            synchronized (OkHttpUtil.class)            {                if (singleton == null)                {                    singleton = new OkHttpClient();                }            }        }        return singleton;    }}

之前在看okhttp源码的时候,发现square没有对okhttpclient进行单例,网上也没找到合适的解释,以下是自己的猜测

优点:使用单例模式,避免了多次创建所产生的垃圾
缺点:对于一些特殊需求的代码进行一些灵活的配置,单例模式难以实现
总结:做为优秀的开源框架,square出发点是让用户更好更灵活的使用和扩展,从用户角度来说,对于不需要多次配置的项目,可以手动写一个单例模式,便于内存的高效利用

/** * okhttp再次封装 * Created by zm on 16-2-1 * update by zm on 16-3-19 增加Builder,方便以后内容或者字段的扩展 *  */public class HttpTools{    private Context context;    private final RequestParams req;    private final Handler handler;    public HttpTools(Builder builder)    {        // TODO Auto-generated constructor stub        context = builder.context;        req = builder.req;        handler = builder.handler;    }    public static class Builder    {        private final RequestParams req;        private final Context context;        private final Handler handler;        public Builder(RequestParams req, Context mContext, Handler handler)        {            // TODO Auto-generated constructor stub            this.req = req;            this.context = mContext;            this.handler = handler;        }        public HttpTools build() {            return new HttpTools(this);        }    }    public void requestBuilder() {        // TODO Auto-generated method stub        if(req==null||context==null||handler==null){            throw new NullPointerException("NullPointerException");        }        requestGet(req, context, handler);    }    private static void parse(Call call, final Handler handler,            final RequestParams req) {        // 请求加入调度        call.enqueue(new Callback()        {            @Override            public void onResponse(Call call, Response response)                    throws IOException {                // TODO Auto-generated method stub                String result = response.body().string();                if (result != null)                {                    Message message = Message.obtain();                    message.obj = result;                    message.what = req.getSuccessMsgWhat();                    handler.sendMessage(message);                }            }            @Override            public void onFailure(Call call, IOException e) {                // TODO Auto-generated method stub                handler.sendEmptyMessage(req.getFailMsgWhat());            }        });    }    /**     *      * @param req     * @param context     * @param handler     *      *            get请求     */    public static void requestGet(final RequestParams req,            final Context context, final Handler handler) {        // 创建一个Request        final Request request = new Request.Builder().url(req.getRequestUrl()).build();        Call call = OkHttpUtil.getInstance().newCall(request);        parse(call, handler, req);    }    /**     * post请求     */    public static void requestPost(final RequestParams req,            final Context context, final Handler handler) {        FormBody.Builder builder = new FormBody.Builder();        //此处是对RequestParams的遍历,RequestParams类省略        for (Map.Entry<String, Object> mEntry : req.getParamEntry())        {            String mEntryKey = mEntry.getKey();            Object mEntryValue = mEntry.getValue();            if (TextUtils.isEmpty(mEntryKey))            {                continue;            }            builder.add(mEntryKey, mEntryValue.toString());        }        RequestBody body = builder.build();        Request request = new Request.Builder().url(req.getUrl()).post(body).build();        Call call = OkHttpUtil.getInstance().newCall(request);        parse(call, handler, req);    }    /**     *            数据请求的集中管理,方便以后一键替换,从get到post     */    public static void request(RequestParams req, Context mContext,            Handler handler) {        // TODO Auto-generated method stub        requestGet(req, mContext, handler);    }}

最后再奉献上一个封装类

/** *  * Created by zm on 16-2-1 * 基于Gson的json转model封装类 * */public class JsonToModel{private static String info = "info";    public static String getInfo()    {        return info;    }    public static void setInfo(String info)    {        JsonToModel.info = info;    }    /**     *      * @param msg     * @param t     *            model类     * @param model     *            model对象     * @return     */    public static <T> List<T> getJsonArrayToModel(Message msg, Class<T> t,            T model) {        // TODO Auto-generated method stub        List<T> list = new ArrayList<T>();        try {            JSONObject json = new JSONObject(msg.obj.toString());            for (int i = 0; i < json.getJSONArray(getInfo()).length(); i++) {                model = GsonHelper.toType(json.getJSONArray(getInfo()).get(i).toString(), t);                list.add(model);            }            return list;        } catch (Exception e) {            // TODO Auto-generated catch block            Log.e("getJsonArrayToModel", "error");            e.printStackTrace();        }        return null;    }}

json转model的这个类中,当时没考虑到过多性能的问题,在此类中即使用了org.json.JSONObject也使用了gson,此处还可以做出相应的优化

0 0
原创粉丝点击