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
*/
publicstaticListgetJsonArrayToModel(Messagemsg,Classt,
Tmodel){
//TODOAuto-generatedmethodstub
Listlist=newArrayList();
try{
JSONObjectjson=newJSONObject(msg.obj.toString());
for(inti=0;i
json转model的这个类中,当时没考虑到过多性能的问题,在此类中即使用了org.json.JSONObject也使用了gson,此处还可以做出相应的优化
如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!