欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】

程序员文章站 2023-01-22 09:06:26
本文实例讲述了android开发之httpclient异步请求数据的方法。分享给大家供大家参考,具体如下: 前面一篇android开发笔记之:asynctask的应用较为...

本文实例讲述了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";

Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】

看图就知道,我又写了一个类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程序设计有所帮助。