AndroID OKhttp的单例和再封装的实例
/** * 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 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,req); } /** * 数据请求的集中管理,方便以后一键替换,从get到post */ public static voID request(RequestParams req,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,此处还可以做出相应的优化
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
总结以上是内存溢出为你收集整理的Android OKHTTP的单例和再封装的实例全部内容,希望文章能够帮你解决Android OKHTTP的单例和再封装的实例所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)