Android OKHTTP的单例和再封装的实例
AndroidOKHTTP的单例和再封装的实例
/** *Createdbyzmon16-2-1 *okhttp的再封装,对于2.x版本,3.x版本将原有对okhttpclient配置 *改成了builder模式配 *置,对于超时、代理、dns,okhttp已经做好了配置, *若不需要特殊配置,可以跳过 */ publicclassOkHttpUtil { privatestaticOkHttpClientsingleton; //非常有必要,要不此类还是可以被new,但是无法避免反射,好恶心 privateOkHttpUtil(){ } publicstaticOkHttpClientgetInstance(){ if(singleton==null) { synchronized(OkHttpUtil.class) { if(singleton==null) { singleton=newOkHttpClient(); } } } returnsingleton; } }
之前在看okhttp源码的时候,发现square没有对okhttpclient进行单例,网上也没找到合适的解释,以下是自己的猜测
优点:使用单例模式,避免了多次创建所产生的垃圾
缺点:对于一些特殊需求的代码进行一些灵活的配置,单例模式难以实现
总结:做为优秀的开源框架,square出发点是让用户更好更灵活的使用和扩展,从用户角度来说,对于不需要多次配置的项目,可以手动写一个单例模式,便于内存的高效利用
/** *okhttp再次封装 *Createdbyzmon16-2-1 *updatebyzmon16-3-19增加Builder,方便以后内容或者字段的扩展 * */ publicclassHttpTools { privateContextcontext; privatefinalRequestParamsreq; privatefinalHandlerhandler; publicHttpTools(Builderbuilder) { //TODOAuto-generatedconstructorstub context=builder.context; req=builder.req; handler=builder.handler; } publicstaticclassBuilder { privatefinalRequestParamsreq; privatefinalContextcontext; privatefinalHandlerhandler; publicBuilder(RequestParamsreq,ContextmContext,Handlerhandler) { //TODOAuto-generatedconstructorstub this.req=req; this.context=mContext; this.handler=handler; } publicHttpToolsbuild(){ returnnewHttpTools(this); } } publicvoidrequestBuilder(){ //TODOAuto-generatedmethodstub if(req==null||context==null||handler==null){ thrownewNullPointerException("NullPointerException"); } requestGet(req,context,handler); } privatestaticvoidparse(Callcall,finalHandlerhandler, finalRequestParamsreq){ //请求加入调度 call.enqueue(newCallback() { @Override publicvoidonResponse(Callcall,Responseresponse) throwsIOException{ //TODOAuto-generatedmethodstub Stringresult=response.body().string(); if(result!=null) { Messagemessage=Message.obtain(); message.obj=result; message.what=req.getSuccessMsgWhat(); handler.sendMessage(message); } } @Override publicvoidonFailure(Callcall,IOExceptione){ //TODOAuto-generatedmethodstub handler.sendEmptyMessage(req.getFailMsgWhat()); } }); } /** * *@paramreq *@paramcontext *@paramhandler * *get请求 */ publicstaticvoidrequestGet(finalRequestParamsreq, finalContextcontext,finalHandlerhandler){ //创建一个Request finalRequestrequest=newRequest.Builder().url(req.getRequestUrl()).build(); Callcall=OkHttpUtil.getInstance().newCall(request); parse(call,handler,req); } /** *post请求 */ publicstaticvoidrequestPost(finalRequestParamsreq, finalContextcontext,finalHandlerhandler){ FormBody.Builderbuilder=newFormBody.Builder(); //此处是对RequestParams的遍历,RequestParams类省略 for(Map.EntrymEntry:req.getParamEntry()) { StringmEntryKey=mEntry.getKey(); ObjectmEntryValue=mEntry.getValue(); if(TextUtils.isEmpty(mEntryKey)) { continue; } builder.add(mEntryKey,mEntryValue.toString()); } RequestBodybody=builder.build(); Requestrequest=newRequest.Builder().url(req.getUrl()).post(body).build(); Callcall=OkHttpUtil.getInstance().newCall(request); parse(call,handler,req); } /** *数据请求的集中管理,方便以后一键替换,从get到post */ publicstaticvoidrequest(RequestParamsreq,ContextmContext, Handlerhandler){ //TODOAuto-generatedmethodstub requestGet(req,mContext,handler); } }
最后再奉献上一个封装类
/** * *Createdbyzmon16-2-1 *基于Gson的json转model封装类 * */ publicclassJsonToModel { privatestaticStringinfo="info"; publicstaticStringgetInfo() { returninfo; } publicstaticvoidsetInfo(Stringinfo) { JsonToModel.info=info; } /** * *@parammsg *@paramt *model类 *@parammodel *model对象 *@return */ publicstaticList getJsonArrayToModel(Messagemsg,Class t, Tmodel){ //TODOAuto-generatedmethodstub List list=newArrayList (); try{ JSONObjectjson=newJSONObject(msg.obj.toString()); for(inti=0;i json转model的这个类中,当时没考虑到过多性能的问题,在此类中即使用了org.json.JSONObject也使用了gson,此处还可以做出相应的优化
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!