Android AndBase框架使用封装好的函数完成Http请求(三)
本文是针对andbase框架学习整理的第三篇笔记,想要了解andbase框架的朋友可以阅读本文,大家共同学习。
学习内容:
1.使用andbase框架实现无参http get请求...
2.使用andbase框架实现有参http post请求...
3.使用andbase框架实现有参http get请求...
andbase框架为我们提供了一些相关的方法提供给我们使用,用来完成http网络请求...总体就是对http请求的一个封装,不过个人认为,网络请求这一模块更加推荐使用volley框架..楼主对比了两个框架中的源码...volley更多的地方是使用抽象方法封装在接口内,然后对外暴露接口,其他类在实现接口的同时需要实现内部的抽象方法...而andbase则是使用继承的方式..继承父类..实现类通过重写的方式对封装的方法重写从而进行下一步的操作...
相比二者网络请求的源码,volley源码的书写还是更胜一筹...volley是google推出的,针对的也仅仅是网络请求这一模块...同样andbase也是非常优秀的,是国内牛人写的一款重量级框架,涉及的模块非常的广泛,还是非常好用的...
1.使用andbase框架实现无参http get请求
一般普通的网络请求如果不涉及到数据信息的变化,也就是不涉及一些安全性问题,都可以使用get方式来完成网络请求...get请求也是分为有参和无参的,给我的感觉有参一般可以用于向服务器上传资源数据...先介绍一下无参的get请求...还是先从源码的地方来看看...
源码的调用方式是先使用abhttputils.get()函数调用...不过这无关紧要...通过这个方法走向abhttpclient类内部...执行下面这段源码...无论是有参还是无参..都会调用这个方法..无参的时候第二个参数传递null就行了...
public void get(final string url,final abrequestparams params,final abhttpresponselistener responselistener) { responselistener.sethandler(new responderhandler(responselistener)); executorservice.submit(new runnable() { public void run() { try { doget(url,params,responselistener); } catch (exception e) { e.printstacktrace(); } } }); }
我们可以看到,这段函数首先通过handler发送message...同时开启一个线程池,来提交当前的请求,最后将执行doget()方法,同时handler一直对responselistener的消息进行处理..doget()方法的源码过程如下
private void doget(string url,abrequestparams params,abhttpresponselistener responselistener){ try { responselistener.sendstartmessage(); if(!debug && !abapputil.isnetworkavailable(mcontext)){ responselistener.sendfailuremessage(abconstant.connect_failure_code,abconstant.connectexception, new abappexception(abconstant.connectexception)); return; } //httpget连接对象 if(params!=null){ url += params.getparamstring(); //如果有参,那么获取相关参数... } httpget httprequest = new httpget(url); //定义连接对象.. basichttpparams httpparams = new basichttpparams(); // 从连接池中取连接的超时时间,设置为1秒 connmanagerparams.settimeout(httpparams, default_socket_timeout); connmanagerparams.setmaxconnectionsperroute(httpparams, new connperroutebean(default_max_connections)); connmanagerparams.setmaxtotalconnections(httpparams, default_max_connections); // 读响应数据的超时时间 httpconnectionparams.setsotimeout(httpparams, default_socket_timeout); httpconnectionparams.setconnectiontimeout(httpparams, default_socket_timeout); httpconnectionparams.settcpnodelay(httpparams, true); httpconnectionparams.setsocketbuffersize(httpparams, default_socket_buffer_size); //设置协议版本... httpprotocolparams.setversion(httpparams, httpversion.http_1_1); httpprotocolparams.setuseragent(httpparams, string.format("andbase-http/%s (http://www.418log.org/)", 1.0)); // 设置请求参数 httprequest.setparams(httpparams); //取得httpclient对象 httpclient httpclient = new defaulthttpclient(); //请求httpclient,取得httpresponse httpresponse httpresponse = httpclient.execute(httprequest); //请求成功 int statuscode = httpresponse.getstatusline().getstatuscode(); //取得返回的字符串 httpentity mhttpentity = httpresponse.getentity(); if (statuscode == httpstatus.sc_ok){ if(responselistener instanceof abstringhttpresponselistener){ string content = entityutils.tostring(mhttpentity); ((abstringhttpresponselistener)responselistener).sendsuccessmessage(statuscode, content); }else if(responselistener instanceof abbinaryhttpresponselistener){ readresponsedata(mhttpentity,((abbinaryhttpresponselistener)responselistener)); }else if(responselistener instanceof abfilehttpresponselistener){ //获取文件名 string filename = abfileutil.getfilenamefromurl(url, httpresponse); writeresponsedata(mhttpentity,filename,((abfilehttpresponselistener)responselistener)); } }else{ string content = entityutils.tostring(mhttpentity); responselistener.sendfailuremessage(statuscode, content, new abappexception(abconstant.unknownhostexception)); } } catch (exception e) { e.printstacktrace(); //发送失败消息 responselistener.sendfailuremessage(abconstant.untreated_code,e.getmessage(),new abappexception(e)); }finally{ responselistener.sendfinishmessage(); } }
有了上面的源码调用过程其实就非常的清晰了..
无论是doget()方法还是dopost()方法模式基本是相同的,都是需要先建立一个连接对象,httpget或httppost..不同之处在于有参的get请求直接将params加入到url后面即可,而post请求需要获取实体数据..在实体数据中加入我们传递的params..设置连接过程和读取数据过程中的相关参数,比如说超时的时间,使用的http版本,设置useragent等等...设置完之后执行请求获取响应了...
中间涉及到了一个判断的过程..判断返回的响应数据到底属于什么类型的数据,是基本的string类型,还是与图片或者视频相关的byte类型,还是与文件相关的file类型...通过对相关类型的判断,执行不同的方法,虽然方法不相同,但是最后的目的是一样的,都是把实体数据进行封装...封装完毕后调用sendsuccessmessage然后handler自动回去处理message...最后调用onsuccess方法..将数据返回给客户端..
还是看一下实际的调用过程:
无参的get请求调度,这里需要设置相应监听:
public void fileclick(view v){ url="http://192.168.199.172:8080/jsp/imageview.jpg"; getview(); httputil.get(url, new fileresponselistener(this, this, v,max_tv,num_tv,progressbar)); } getresponselistener.java
对响应的监听的一个重写过程...通过为请求设置上url+相关监听就能够完成网络请求,并对请求数据进行相关处理了...这里完成了一个图片数据的下载,然后通过对数据进行封装,就成了一个bitmap..这样就能够在控件上进行显示了..
package com.example.andbasehttp; import java.io.file; import android.app.alertdialog; import android.content.context; import android.content.dialoginterface; import android.content.dialoginterface.onclicklistener; import android.graphics.bitmap; import android.view.view; import android.widget.imageview; import android.widget.textview; import com.ab.activity.abactivity; import com.ab.http.abfilehttpresponselistener; import com.ab.util.abfileutil; import com.ab.view.progress.abhorizontalprogressbar; public class fileresponselistener extends abfilehttpresponselistener{ private int max=100; private int progress=0; private abactivity activity; private context context; private alertdialog dialog; private view view; private textview max_tv,num_tv; private abhorizontalprogressbar progressbar; public fileresponselistener(abactivity activity,context context,view v,textview v1,textview v2, abhorizontalprogressbar progressbar ){ this.activity=activity; this.context=context; this.view=v; this.max_tv=v1; this.num_tv=v2; this.progressbar=progressbar; } @override public void onsuccess(int statuscode, file file){ bitmap bitmap=abfileutil.getbitmapfromsd(file); imageview view=new imageview(context); view.setimagebitmap(bitmap); activity.showdialog("返回结果", view, new onclicklistener() { @override public void onclick(dialoginterface dialog, int which) { // todo auto-generated method stub } }); } @override public void onfailure(int statuscode, string content,throwable error){ activity.showtoast(error.tostring()); } @override public void onstart(){ max_tv.settext(progress+"/"+string.valueof(max)); progressbar.setmax(max); progressbar.setprogress(progress); dialog=activity.showdialog("正在下载", view); } @override public void onprogress(int byteswritten, int totalsize){ max_tv.settext(byteswritten/(totalsize/max)+"/"+max); progressbar.setprogress(byteswritten/(totalsize/max)); } @override public void onfinish(){ dialog.cancel(); dialog=null; } }
2.使用andbase框架实现有参http post请求
其实调用的方式都是相同的,,只不过post请求需要传递相关的参数...使用有参的post请求...这里是向一个jsp传递相关参数来完成数据信息的验证...
public void postclick(view v){ url="http://192.168.199.172:8080/jsp/post.jsp"; params=new abrequestparams(); params.put("name", "darker"); params.put("password", "49681888"); httputil.post(url, params, new postresponselistener(this)); }
这里我就不粘贴postresponselistener的代码了...贴一下jsp页面的代码..相关的jsp代码如下...这里的jsp代码非常的简单..并且前面在使用volley的时候也使用过..jsp页面我们完全可以自己书写的更加复杂一些,那么就能够实现更多的功能...
<% string name=request.getparameter("name"); string password=request.getparameter("password"); if("darker".equals(name)&& "49681888".equals(password)){ out.println("receive name is:"+name); out.println("receive password is:"+password);%> your message are right! <%}else{ out.println("receive name is:"+name); out.println("receive password is:"+password);%> your message are wrong! <%}%>
3.使用andbase框架实现有参http get请求
有参的get请求一般用于文件,数据资源的上传...将上传的资源以及名称作为参数传递给服务器..这里不涉及安全上的问题..因此可以使用带有参数的get请求...这里向服务器上传文件..需要添加相关参数...
public void fileloadclick(view v){ url="http://192.168.199.172:8080"; abrequestparams params = new abrequestparams(); file pathroot = environment.getexternalstoragedirectory(); string path = pathroot.getabsolutepath(); file file1 = new file(path+"/download/cache_files/aa.txt"); params.put(file1.getname(),file1); getview(); httputil.get(url, params, new filesendresponselistener(this, this, v, max_tv, num_tv, progressbar)); }
这里的监听事件简单的粘贴一下...监听事件之所以传递控件..是为了更好的向用户进行展示...这里设置了一个进度条的方式,来贯穿整个请求——响应的过程...如果下载或者是上传的文件和资源过多...我们是必须通知用户相关进度的..总不能一直卡死在界面上..这样用户也无法知道到底是否完成了数据的上传或者是下载...
package com.example.andbasehttp; import android.app.alertdialog; import android.content.context; import android.view.view; import android.widget.textview; import com.ab.activity.abactivity; import com.ab.http.abstringhttpresponselistener; import com.ab.view.progress.abhorizontalprogressbar; public class filesendresponselistener extends abstringhttpresponselistener{ private int max=100; private int progress=0; private abactivity activity; private context context; private alertdialog dialog; private view view; private textview max_tv,num_tv; private abhorizontalprogressbar progressbar; public filesendresponselistener(abactivity activity,context context,view v,textview v1,textview v2, abhorizontalprogressbar progressbar ){ this.activity=activity; this.context=context; this.view=v; this.max_tv=v1; this.num_tv=v2; this.progressbar=progressbar; } @override public void onsuccess(int statuscode, string content){ activity.showtoast("onsuccess"); system.out.println(content); } @override public void onfailure(int statuscode, string content,throwable error){ activity.showtoast(error.tostring()); } @override public void onstart(){ max_tv.settext(progress+"/"+string.valueof(max)); progressbar.setmax(max); progressbar.setprogress(progress); activity.showtoast("正在下载"); dialog=activity.showdialog("正在下载", view); } @override public void onprogress(int byteswritten, int totalsize){ max_tv.settext(byteswritten/(totalsize/max)+"/"+max); progressbar.setprogress(byteswritten/(totalsize/max)); } @override public void onfinish(){ dialog.cancel(); dialog=null; } }
涉及到的类为com.ab.http保内的所有类...
1.abstringhttpresponselistener.java
2.abbinaryhttpresponselistener.java
3.abfilehttpresponselistener.java
这三个类是对abhttpresponselistener.java的一个继承...继承了其内部的一些相关方法..包括请求开始,结束,失败等等函数...
abhttpclient.java就是用来完成请求——连接过程的实现...其中还包含数据的封装;
abhttputils.java则是对post,get等方法调用的一个中间层;
abrequestparams.java 则是对请求参数处理的一个类,不仅包含对请求参数的处理,还包含对实体的创建,为实体添加相关参数等方法的实现过程。
以上就是本文的全部内容,希望对大家的学习有所帮助。
下一篇: css 命名规范