您的位置:首页 > 理论基础 > 计算机网络

使用AsyncHttpClient 框架提交数据

2016-03-21 16:21 363 查看
    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 参数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: