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";
看图就知道,我又写了一个类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


猜你喜欢
- 目录背景统一接口返回定义API返回码枚举类定义正常响应的API统一返回体定义异常响应的API统一返回体编写包装返回结果的自定义注解定义返回结
- 1.c#里面的TabControl控件没有关闭按钮,而且很难看。2.有一些已经做好的第三方控件,但是收费。3.由于我的故障树推理诊断项目在绘
- 废话不多说了,直接给大家贴代码了,具体代码如下所示:package com.example.yanlei.yl4;import androi
- 项目运行:环境配置:Jdk1.8 + Tomcat8.5 + mysql + Eclispe(IntelliJ IDEA,Eclispe,M
- java使用HttpClient调用接口HttpClient 提供的主要的功能(1)实现了所有 HTTP 的方法(GET,POST,PUT,
- 过去在Android上网络通信都是使用的Xutils 因为用它可以顺道处理了图片和网络这两个方面,后来发觉Xutils里面使用的是HttpC
- 简介本次五子棋使用的是光标控制移动,通过按空格键(键值32)来落子,实现游戏的。我们额外用到的头文件有:#include<getch.
- 本文实例讲述了Android权限操作之uses-permission。分享给大家供大家参考,具体如下:我们在安装Android软件的时候,系
- 项目中需要用到类似公告栏的控件,能用的基本不支持多行显示,于是只好自己动手,苦于没有自定义过一个像样的控件,借鉴Android公告条demo
- package com.ppmeet; import java.io.IOException; import and
- 前言翻看了下以前大学学习的一些小项目,突然发现有个项目比较有意思,觉得有必要把它分享出来。当然现在看来,里面有很多的不足之处,但因博主现在已
- 方法有4种:使用 String 类的 valueOf() 方法使用字符串连接使用 Character 类的 toString() 方法使用字
- Kryo框架的source已移至https://github.com/EsotericSoftware/kryo ,进入此页面,然后点击右边
- 目录Sonar概述一、 搭建sona服务二、idea配置三、 配置maven的setting.xml文件四、idea中 mvn sonar:
- Android手势解锁本文讲述的是一个手势解锁的库,可以定制显示隐藏宫格点、路径、并且带有小九宫格显示图,和震动!让你学会使用这个简单,高效
- 对数组使用 foreachC#提供 foreach 语句。 该语句提供一种简单、明了的方法来循环访问数组或任何可枚举集合的元素。 forea
- 首先来说一下本文中例子所要实现的功能:基于ProtoBuf序列化对象使用Socket实现时时通信数据包的编码和解码下面来看具体的步骤:一、U
- 大家在登录网站的时候,大部分时候是通过一个表单提交登录信息。但是有时候浏览器会弹出一个登录验证的对话框,如下图,这就是使用HTTP基本认证。
- SpringCloud启动失败问题Nacos配置读取失败org.yaml.snakeyaml.error.YAMLException: ja
- 在此附上超详细JDK1.8安装与配置超详细JDK1.8安装与配置一、卸载JDK应用程序①在开始处,点击设置②点击应用③点击程序和功能④打开程