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 参数。