软件编程
位置:首页>> 软件编程>> Android编程>> Android开发之HttpClient异步请求数据的方法详解【附demo源码下载】

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

作者:飘走的我  发布时间:2023-01-09 11:08:31 

标签:Android,HttpClient,异步请求

本文实例讲述了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程序设计有所帮助。

来源:http://blog.csdn.net/qq_33642117/article/details/52006355

0
投稿

猜你喜欢

手机版 软件编程 asp之家 www.aspxhome.com