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程序设计有所帮助。