Anroid之HttpClient异步请求数据

本文介绍如何使用HttpClient发起GET和POST请求,并通过Asynctask处理异步任务,实现Android应用与服务器交互。文章详细展示了HttpClientTask类的设计,包括发送请求、处理响应及错误情况。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

现在来结合使用一下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("出错了");
	}
}

源码免费:下载



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值