Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】
本文实例讲述了android开发之httpclient异步请求数据的方法。分享给大家供大家参考,具体如下:
前面一篇android开发笔记之:asynctask的应用较为详细的讲述了asynctask的原理与应用,这里来结合使用一下httpclient与asynctask~
代码编写如下:
服务器代码我就不写出来了,就是一个用户名和密码~
1.写一个类httpclientutil,来实现httpclient对象的创建并且返回httpresponse对象
public class httpclientutil { private static httpclient httpclient; static{ //1.创建httpclient对象 httpclient=new defaulthttpclient(); } //2.执行该方法返回一个httpresponse public static httpresponse sendrequest(string url,list<namevaluepair>list){ httpresponse response=null; try { if(list==null){ //get方式 httpget get=new httpget(url); response=httpclient.execute(get); }else{ //post方式 httppost post=new httppost(url); //3.对于httppost对象而言,可调用setentity(httpentity)方法设置请求参数。 //4.使用httpentity下的urlencodedformentitiy对象传入一个放入basicnamevaluepair的集合中提交的数据。 post.setentity(new urlencodedformentity(list)); response=httpclient.execute(post); } }catch (exception e) { // todo auto-generated catch block e.printstacktrace(); } return response; } }
get方式和post方式就是有点不一样~它们请求数据的时候get方式没有namevaluepair~
2.写一个监听接口responselistener,来实现监听服务器返回的数据
public interface responselistener { public void onresult(string msg); public void onerror(string msg); }
3.写下mainactivity中的get方法提交和post方法提交
//get方式 public void get(view view){ string namete=name.gettext().tostring(); string pwdte=pwd.gettext().tostring(); httpclienttask task=new httpclienttask(this); //要传进去的参数 task.execute(basic+"?name="+namete+"&pwd="+pwdte); } //post方式 public void post(view view){ string namete=name.gettext().tostring(); string pwdte=pwd.gettext().tostring(); list<namevaluepair>list=new arraylist<namevaluepair>(); list.add(new basicnamevaluepair("name", namete)); list.add(new basicnamevaluepair("pwd", pwdte)); httpclienttask task=new httpclienttask(list, this); task.execute(basic); }
public static final string basic="http://192.168.207.1:8090/connectionservlet/loginservlet";
看图就知道,我又写了一个类httpclienttask~
4.编写httpclienttask,让其继承asynctask~
/* * params:输入参数,如果不需要传递参数,则直接设为void即可 --string * progress:子线程执行的百分比 --void * result:返回的参数 --httpresonse */ public class httpclienttask extends asynctask<string, void, httpresponse>{ private list<namevaluepair>list; private responselistener listener; //get请求 public httpclienttask(responselistener listener) { super(); // todo auto-generated constructor stub this.listener=listener; } //post请求 public httpclienttask(list<namevaluepair>list,responselistener listener) { super(); // todo auto-generated constructor stub this.list=list; this.listener=listener; } //doinbackground有返回值,并且返回值是由result决定的, //参数列表首先是一个可变长参数,是由params决定的 //执行时机:在onpreexecute方法执行后马上执行,该方法运行在后线程中 //作用:主要负责执行那些很耗时的后台处理工作,可以调用publishprogress方法来更新实时的任务进度 @override protected httpresponse doinbackground(string... params) { // todo auto-generated method stub httpresponse response; //这里会返回一个response response=httpclientutil.sendrequest(params[0], list); return response; } //参数是由result决定的 //作用:后台的计算结果将显示出来 //可以进行一些结束处理 @override protected void onpostexecute(httpresponse result) { // todo auto-generated method stub string msg; try { //result是响应内容 //用entityutils.tostring(httpentity,"编码方式") //将其转成为字符串 msg=entityutils.tostring(result.getentity(), "utf-8"); if(listener!=null){ listener.onresult(msg); } }catch (exception e) { // todo auto-generated catch block e.printstacktrace(); listener.onresult("出错了"); } super.onpostexecute(result); } }
代码写的很清楚,我就不一一解释了~
最后在onpostexecute方法后面调用了接口中的俩个方法~
这俩个方法在mainactivity中被重写了~
@override public void onresult(string msg) { // todo auto-generated method stub system.out.println(msg); } @override public void onerror(string msg) { // todo auto-generated method stub system.out.println("出错了"); }
说实话,服务器返回的数据就是成功或者失败~
如果那个监听器为空的话,就代表链接错误,后台会打印出“出错了”
否则会打印出“成功”或者“失败”~
mainactivity完整代码:
public class mainactivity extends activity implements responselistener{ private edittext name,pwd; public static final string basic="http://192.168.207.1:8090/connectionservlet/loginservlet"; //get方式 public void get(view view){ string namete=name.gettext().tostring(); string pwdte=pwd.gettext().tostring(); httpclienttask task=new httpclienttask(this); //要传进去的参数 task.execute(basic+"?name="+namete+"&pwd="+pwdte); } //post方式 public void post(view view){ string namete=name.gettext().tostring(); string pwdte=pwd.gettext().tostring(); list<namevaluepair>list=new arraylist<namevaluepair>(); list.add(new basicnamevaluepair("name", namete)); list.add(new basicnamevaluepair("pwd", pwdte)); httpclienttask task=new httpclienttask(list, this); task.execute(basic); } @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.activity_main); name=(edittext) findviewbyid(r.id.name); pwd=(edittext) findviewbyid(r.id.pwd); } @override public void onresult(string msg) { // todo auto-generated method stub system.out.println(msg); } @override public void onerror(string msg) { // todo auto-generated method stub system.out.println("出错了"); } }
附:完整实例代码点击此处本站下载。
更多关于android相关内容感兴趣的读者可查看本站专题:《android开发入门与进阶教程》、《android视图view技巧总结》、《android编程之activity操作技巧总结》、《android文件操作技巧汇总》、《android资源操作技巧汇总》及《android控件用法总结》
希望本文所述对大家android程序设计有所帮助。