使用AsyncHttpClient 框架提交数据

    AsyncHttpClient 是开源免费的基于HttpClient 的网络请求框架,其源码托管在githu 上。下载地址:
https://github.com/loopj/android-async-http。
    如图1-2 所示为AsyncHttpClient 在github 的网页,大家可以点击右下角的按钮,将源码下载下来,然

后将下载好的压缩包解压,把src 目录中源码拷贝到自己的工程的src 目录下,比如图1-3 所示。


图1-2 AsyncHttpClient 网页




图1-3 将AsyncHttpClient 添加到工程中


1.4.1 get 方式提交

    在1.2 节工程的基础上,只需要修改部分代码即可。因此这里只给出核心代码。
  【文件1-7】get 方式提交数据代码片段

	/**
	 * 使用AsyncHttpClient 的get 方式提交数据
	 * 
	 * @param view
	 */
	public void login5(View view) {
		// 获取用户数据
		final String username = et_username.getText().toString().trim();
		final String password = et_password.getText().toString().trim();
		// 校验数据
		if (TextUtils.isEmpty(password) || TextUtils.isEmpty(username)) {
			Toast.makeText(this, "用户名或密码不能为空!", Toast.LENGTH_SHORT).show();
			return;
		}
		String path = "http://10.0.2.2:8080/userlogin/servlet/LoginServlet?username="
				+ URLEncoder.encode(username) + "&password=" + password;
		// 创建一个AsyncHttpClient
		AsyncHttpClient client = new AsyncHttpClient();
		// 执行get 方式请求
		client.get(path, new DataAsyncHttpResponseHandler() {
			/*
			 * 请求网络是在子线程中进行的,当请求成功后回调onSuccess 方法, 该方法是在主线程中被调用了,其内部是通过Handler
			 * 实现的 当请求成功后回调该方法 参数1:返回的状态码 参数2:响应头 参数3:返回的数据
			 */
			@Override
			public void onSuccess(int statusCode, Header[] headers,
					byte[] responseBody) {
				Log.d("tag", Thread.currentThread().getName());
				// 将responseBody 字节数组转化为字符串
				Toast.makeText(MainActivity.this, new String(responseBody),
						Toast.LENGTH_LONG).show();
			}

			/*
			 * 当请求失败后回调该方法,该方法依然在主线程中被执行
			 */
			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] responseBody, Throwable error) {
				Toast.makeText(MainActivity.this, new String(responseBody),
						Toast.LENGTH_LONG).show();
			}
		});
	}


1.4.2 post 方式提交

【文件1-8】post 方式提交数据代码片段

/**
	 * 使用AsyncHttpClient 的post 方式提交数据
	 * 
	 * @param view
	 */
	public void login6(View view) {
		// 获取用户数据
		final String username = et_username.getText().toString().trim();
		final String password = et_password.getText().toString().trim();
		// 校验数据
		if (TextUtils.isEmpty(password) || TextUtils.isEmpty(username)) {
			Toast.makeText(this, "用户名或密码不能为空!", Toast.LENGTH_SHORT).show();
			return;
		}
		String path = "http://10.0.2.2:8080/userlogin/servlet/LoginServlet";
		// 创建一个AsyncHttpClient
		AsyncHttpClient client = new AsyncHttpClient();
		// 封装请求参数
		RequestParams params = new RequestParams();
		params.put("username", username);
		params.put("password", password);
		/*
		 * 执行post 请求 参数1:url 地址 参数2:请求参数 参数3:回调接口,在该接口中实现成功和失败方法,该过程是异步的。
		 */
		client.post(path, params, new DataAsyncHttpResponseHandler() {

			@Override
			public void onSuccess(int statusCode, Header[] headers,
					byte[] responseBody) {
				Toast.makeText(MainActivity.this, new String(responseBody),
						Toast.LENGTH_LONG).show();
			}

			@Override
			public void onFailure(int statusCode, Header[] headers,
					byte[] responseBody, Throwable error) {
				Toast.makeText(MainActivity.this, new String(responseBody),
						Toast.LENGTH_LONG).show();
			}
		});
	}

1.4.3 总结
一、get 请求方式步骤
1、创建一个AsyncHttpClient 对象
AsyncHttpClient client = new AsyncHttpClient();
2、执行get 方法
/*
* 执行get 方式请求
* 参数1:请求的url 地址
* 参数2:回调接口。在该接口中实现相应成功和失败方法,该过程是异步的。
*/
client.get(path, new DataAsyncHttpResponseHandler() {
/*
* 请求网络是在子线程中进行的,当请求成功后回调onSuccess 方法,
* 该方法是在主线程中被调用了,其内部是通过Handler 实现的
* 当请求成功后回调该方法
* 参数1:返回的状态码
* 参数2:响应头
* 参数3:返回的数据
*/
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Log.d("tag", Thread.currentThread().getName());
//将responseBody 字节数组转化为字符串
Toast.makeText(MainActivity.this, new String(responseBody),
Toast.LENGTH_LONG).show();
}
/*
* 当请求失败后回调该方法,该方法依然在主线程中被执行

*/
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody,
Throwable error) {
Toast.makeText(MainActivity.this, new String(responseBody),
Toast.LENGTH_LONG).show();
}
});
在执行get 方法的时候需要传递一个ResponseHandlerInterface 接口的子类, 在上面使用了
DataAsyncHttpResponseHandler 抽象类,除此之外其实ResponseHandlerInterface 还有很多子类,比如用于
接收json 字符串的TextHttpResponseHandler,用于接收文件下载的TextHttpResponseHandler。因为我们只
需要接收字节数组,并将字节数组转化为字符串即可,因此我们使用DataAsyncHttpResponseHandler 抽象
类。
二、post 方式请求步骤
1、创建一个AsyncHttpClient 对象
AsyncHttpClient client = new AsyncHttpClient();
2、封装请求参数
//封装请求参数
RequestParams params = new RequestParams();
params.put("username", username);
params.put("password", password);
3、执行post 方法
/*
* 执行post 请求
* 参数1:url 地址
* 参数2:请求参数
* 参数3:回调接口,在该接口中实现成功和失败方法,该过程是异步的。
*/
client.post(path, params, new DataAsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
Toast.makeText(MainActivity.this, new String(responseBody),
Toast.LENGTH_LONG).show();
}
@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody,
Throwable error) {
Toast.makeText(MainActivity.this, new String(responseBody),
Toast.LENGTH_LONG).show();
}
});
post 方法跟get 方式不同的就是多了一个RequestParams 参数。















评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值