Android中网络框架简单封装的实例方法
Android中网络框架的简单封装
前言
Android作为一款主要应用在移动终端的操作系统,访问网络是必不可少的功能。访问网络,最基本的接口有:HttpUrlConnection,HttpClient,而在后续的发展中,出现了Volley,OkHttp,Retrofit等网络封装库。由于各种原因,在实际的项目开发中,我们可能会需要在项目的版本迭代中,切换网络框架。如果对于网络框架没有好的封装,那么当需要切换网络框架时,可能就会有大量的迁移工作要做。
封装网络框架
在架构设计中,面向接口和抽象,是解耦的一个重要原则。本文将基于这一原则,实现一个简单的网络框架封装。
定义网络访问的接口
抽取出不同网络框架的共同方法,定义成接口方法。
publicinterfaceIHttpLoader{
/**
*GET方式请求
*
*@paramurl
*@paramparams
*@paramcallback
*/
voidget(Stringurl,Mapparams,IHttpCallbackcallback);
/**
*POST方式请求
*
*@paramurl
*@paramparams
*@paramcallback
*/
voidpost(Stringurl,Mapparams,IHttpCallbackcallback);
}
定义网络访问的Callback
publicinterfaceIHttpCallback{
/**
*成功时的回调
*
*@paramresult
*/
voidonSuccess(Stringresult);
/**
*失败时的回调
*
*@parammsg
*/
voidonFailed(Stringmsg);
}
定义具体的接口实现类
分别对具体的网络框架进行接口实现,这里以Volley和OkHttp为例
Volley的实现类
publicclassVolleyHttpLoaderimplementsIHttpLoader{
privatestaticRequestQueuemRequestQueue;
publicVolleyHttpLoader(Contextcontext){
mRequestQueue=Volley.newRequestQueue(context);
}
@Override
publicvoidget(Stringurl,Mapparams,finalIHttpCallbackcallback){
StringRequestrequest=newStringRequest(Request.Method.GET,url,
newResponse.Listener(){
@Override
publicvoidonResponse(Strings){
callback.onSuccess(s);
}
},newResponse.ErrorListener(){
@Override
publicvoidonErrorResponse(VolleyErrorvolleyError){
callback.onFailed(volleyError.toString());
}
});
mRequestQueue.add(request);
}
@Override
publicvoidpost(Stringurl,Mapparams,finalIHttpCallbackcallback){
StringRequestrequest=newStringRequest(Request.Method.POST,url,
newResponse.Listener(){
@Override
publicvoidonResponse(Strings){
callback.onSuccess(s);
}
},newResponse.ErrorListener(){
@Override
publicvoidonErrorResponse(VolleyErrorvolleyError){
callback.onFailed(volleyError.toString());
}
});
mRequestQueue.add(request);
}
}
OkHttp的实现类
publicclassOkHttpLoaderimplementsIHttpLoader{
privatestaticOkHttpClientmOkHttpClient;
publicOkHttpLoader(){
mOkHttpClient=newOkHttpClient();
}
@Override
publicvoidget(Stringurl,Mapparams,finalIHttpCallbackcallback){
Requestrequest=newRequest.Builder().url(url).build();
mOkHttpClient.newCall(request).enqueue(newCallback(){
@Override
publicvoidonFailure(@NotNullCallcall,@NotNullIOExceptione){
callback.onFailed(e.toString());
}
@Override
publicvoidonResponse(@NotNullCallcall,@NotNullResponseresponse)throwsIOException{
if(response.isSuccessful()){
Stringresult=response.body().string();
callback.onSuccess(result);
}else{
callback.onFailed(response.message());
}
}
});
}
@Override
publicvoidpost(Stringurl,Mapparams,finalIHttpCallbackcallback){
RequestBodyrequestBody=appendBody(params);
Requestrequest=newRequest.Builder().post(requestBody).url(url).build();
mOkHttpClient.newCall(request).enqueue(newCallback(){
@Override
publicvoidonFailure(@NotNullCallcall,@NotNullIOExceptione){
callback.onFailed(e.toString());
}
@Override
publicvoidonResponse(@NotNullCallcall,@NotNullResponseresponse)throwsIOException{
if(response.isSuccessful()){
Stringresult=response.body().string();
callback.onSuccess(result);
}else{
callback.onFailed(response.message());
}
}
});
}
privateRequestBodyappendBody(Mapparams){
FormBody.Builderbody=newFormBody.Builder();
if(params==null||params.isEmpty()){
returnbody.build();
}
for(Map.Entryentry:params.entrySet()){
body.add(entry.getKey(),entry.getValue().toString());
}
returnbody.build();
}
}
定义Callback的实现
publicabstractclassHttpCallbackimplementsIHttpCallback{ @Override publicvoidonSuccess(Stringresult){ Gsongson=newGson(); Class>clazz=analysisClazzInfo(this); ResultresultObj=(Result)gson.fromJson(result,clazz); onSuccess(resultObj); } /** *成功时的回调 * *@paramresult */ publicabstractvoidonSuccess(Resultresult); privateClass>analysisClazzInfo(Objectobject){ TypegenType=object.getClass().getGenericSuperclass(); Type[]params=((ParameterizedType)genType).getActualTypeArguments(); return(Class>)params[0]; } }
返回的数据Bean
publicclassData{
privateinterrorCode;
privateStringerrorMsg;
privateListdata;
publicintgetErrorCode(){
returnerrorCode;
}
publicvoidsetErrorCode(interrorCode){
this.errorCode=errorCode;
}
publicStringgetErrorMsg(){
returnerrorMsg;
}
publicvoidsetErrorMsg(StringerrorMsg){
this.errorMsg=errorMsg;
}
publicListgetData(){
returndata;
}
publicvoidsetData(Listdata){
this.data=data;
}
publicstaticclassDataBean{
privateintcourseId;
privateintid;
privateStringname;
privateintorder;
privateintparentChapterId;
privatebooleanuserControlSetTop;
privateintvisible;
privateList>children;
publicintgetCourseId(){
returncourseId;
}
publicvoidsetCourseId(intcourseId){
this.courseId=courseId;
}
publicintgetId(){
returnid;
}
publicvoidsetId(intid){
this.id=id;
}
publicStringgetName(){
returnname;
}
publicvoidsetName(Stringname){
this.name=name;
}
publicintgetOrder(){
returnorder;
}
publicvoidsetOrder(intorder){
this.order=order;
}
publicintgetParentChapterId(){
returnparentChapterId;
}
publicvoidsetParentChapterId(intparentChapterId){
this.parentChapterId=parentChapterId;
}
publicbooleanisUserControlSetTop(){
returnuserControlSetTop;
}
publicvoidsetUserControlSetTop(booleanuserControlSetTop){
this.userControlSetTop=userControlSetTop;
}
publicintgetVisible(){
returnvisible;
}
publicvoidsetVisible(intvisible){
this.visible=visible;
}
publicList>getChildren(){
returnchildren;
}
publicvoidsetChildren(List>children){
this.children=children;
}
@Override
publicStringtoString(){
return"DataBean{"+
"courseId="+courseId+
",id="+id+
",name='"+name+'\''+
",order="+order+
",parentChapterId="+parentChapterId+
",userControlSetTop="+userControlSetTop+
",visible="+visible+
",children="+children+
'}';
}
}
@Override
publicStringtoString(){
return"Data{"+
"errorCode="+errorCode+
",errorMsg='"+errorMsg+'\''+
",data="+data+
'}';
}
}
定义统一管理类
publicclassHttpHelperimplementsIHttpLoader{
privatestaticIHttpLoadermHttpLoader;
privateHttpHelper(){
}
publicstaticvoidinit(IHttpLoaderhttpLoader){
mHttpLoader=httpLoader;
}
publicstaticHttpHelperobtain(){
returnHttpHelperHolder.INSTANCE;
}
staticclassHttpHelperHolder{
privatestaticHttpHelperINSTANCE=newHttpHelper();
}
@Override
publicvoidget(Stringurl,Mapparams,IHttpCallbackcallback){
mHttpLoader.get(url,params,callback);
}
@Override
publicvoidpost(Stringurl,Mapparams,IHttpCallbackcallback){
mHttpLoader.post(url,params,callback);
}
}
在Application中初始化
定义一个继承自Application的类,在onCreate方法中初始化网络访问
publicclassAppextendsApplication{
@Override
publicvoidonCreate(){
super.onCreate();
//HttpHelper.init(newOkHttpLoader());
HttpHelper.init(newVolleyHttpLoader(this));
}
}
后续如果需要切换网络框架,只需要在这里修改就可以了。
应用
publicclassMainActivityextendsAppCompatActivity{
privatestaticfinalStringURL_HTTP="https://www.wanandroid.com/wxarticle/chapters/json";
privateImageViewmIv;
@Override
protectedvoidonCreate(BundlesavedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
mTv=findViewById(R.id.tv);
findViewById(R.id.btn_get).setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewv){
HttpHelper.obtain().get(URL_HTTP,null,newHttpCallback(){
@Override
publicvoidonFailed(finalStringmsg){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
mTv.setText(msg);
}
});
}
@Override
publicvoidonSuccess(finalDatadata){
runOnUiThread(newRunnable(){
@Override
publicvoidrun(){
mTv.setText(data.toString());
}
});
}
});
}
});
}
}
结束
这里介绍的,其实只是一个封装的思路。基于这个思路,还可以封装常用的图片访问库等。可以自由拓展。
源码地址:https://github.com/milovetingting/Samples/tree/master/Loader
到此这篇关于Android中网络框架简单封装的实例方法的文章就介绍到这了,更多相关Android中网络框架的简单封装内容请搜索毛票票以前的文章或继续浏览下面的相关文章希望大家以后多多支持毛票票!
声明:本文内容来源于网络,版权归原作者所有,内容由互联网用户自发贡献自行上传,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任。如果您发现有涉嫌版权的内容,欢迎发送邮件至:czq8825#qq.com(发邮件时,请将#更换为@)进行举报,并提供相关证据,一经查实,本站将立刻删除涉嫌侵权内容。