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

Android Asynchronous Http Client的用法实例(详解+源码)

2017-04-16 22:01 681 查看
有用网址:http://www.android100.org/html/201506/19/155632.html
From:http://blog.csdn.net/bruce_shan/article/details/50516692

安卓客户端与后台进行通信有两种办法,即HTTP通信和socket通信,我们这里采用的是HTTP通信的通信方式,基于TCP/IP协议簇。先来比较一下几种HTTP通信方式一, HttpUrlConnection// http地址
String httpUrl = "http://192.168.1.1:8080/GourmetOrderServer/loginServlet?name=jun&paw=123456";
// 获得的数据
String resultData = "";
URL url = null;
try {
//第一步   构造一个URL对象
url = new URL(httpUrl);
} catch (MalformedURLException e) {
Log.e(DEBUG_TAG, "MalformedURLException");
}
if (url != null) {
try {
// 使用HttpURLConnection打开连接
HttpURLConnection httpURLConnection = (HttpURLConnection) url
.openConnection();
// 得到读取的内容(流)
InputStreamReader inputStreamReader = new InputStreamReader(
httpURLConnection.getInputStream());
// 为输出创建BufferedReader
BufferedReader bufferedReader = new BufferedReader(
inputStreamReader);
String inputLine = null;
// 使用循环来读取获得的数据
while (((inputLine = bufferedReader.readLine()) != null)) {
// 我们在每一行后面加上一个"\n"来换行
resultData += inputLine + "\n";
}
// 关闭InputStreamReader
inputStreamReader.close();
// 关闭http连接
httpURLConnection.disconnect();
// 设置显示取得的内容
if (resultData != null) {
mTextView.setText(resultData);
} else {
mTextView.setText("读取的内容为NULL");
}
} catch (IOException e) {
Log.e(DEBUG_TAG, "IOException");
}
} else {
Log.e(DEBUG_TAG, "Url NULL");
}
}
二, 

AsyncHttpClient

AsyncHttpClient的Post和GET方式进行实现的关键代码:/**     * 采用AsyncHttpClient的Post方式进行实现
     * @param userName
     * @param userPass
     */
public void loginByAsyncHttpClientPost(String userName, String userPass) {
AsyncHttpClient client = new AsyncHttpClient(); // 创建异步请求的客户端对象
String url = "http://192.168.1.1:8080/GourmetOrderServer/loginServlet?name=jun&paw=123456"; // 定义请求的地址
// 创建请求参数的封装的对象
RequestParams params = new RequestParams();
// 设置请求的参数名和参数值
params.put("username", userName);
// 设置请求的参数名和参数
params.put("userpass", userPass);
        //执行post方法
client.post(url, params, new AsyncHttpResponseHandler() {

@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
if (statusCode == 200) {  
                   //显示文本  
                  Toast.makeText(LoginActivity.this, new String(responseBody), 1).show();  
               }  
}

@Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
error.printStackTrace();// 把错误信息打印出轨迹来  
}
});
}
    /**
     * 采用AsyncHttpClient的Get方式进行实现 
     * @param userName
     * @param userPass
     */
private void loginByAsyncHttpClientGet(String userName, String userPass) {
// 创建异步的客户端对象
AsyncHttpClient client = new AsyncHttpClient();
// 请求的地址
String url = "http://192.168.1.1:8080/GourmetOrderServer/loginServlet";
// 创建请求参数的封装的对象
RequestParams params = new RequestParams();
// 设置请求的参数名和参数值
params.put("username", userName);
// 设置请求的参数名和参数
params.put("userpass", userPass);
Log.i("mm", "到private void loginByAsyncHttpClientGet来了");

// 发送get请求的时候 url地址 相应参数,匿名回调对象
client.get(url, params, new AsyncHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers,
byte[] responseBody) {
// 成功处理的方法
System.out
.println("statusCode-------------------" + statusCode);
// 遍历头信息
for (int i = 0; i < headers.length; i++) {
Header header = headers[i];
System.out.println("header------------Name:"
+ header.getName() + ",--Value:"
+ header.getValue());
}
Toast.makeText(LoginActivity.this, "登录成功!", 1).show();
}

@Override
public void onFailure(int statusCode, Header[] headers,
byte[] responseBody, Throwable error) {
// 失败处理的方法
Log.i("mm", "到onFailure来了"+"statusCode值"+statusCode+"headers值"+headers+"headers值"+ responseBody+ ""+error);
error.printStackTrace();

Toast.makeText(LoginActivity.this, "登录失败!", 1).show();
}
});
}其他安卓网络请求库方式及其比较可以参考链接:Android 各大网络请求库的比较及实战,android请求库实战-android100学习网http://www.android100.org/html/201506/19/155632.html

通过以上可以看出来,

AsyncHttpClient这个请求库很好用,简单方便,具有一些很好的特点:

所有请求在子线程中完成,请求回调在调用该请求的线程中完成
使用线程池
使用RequestParams类封装请求参数
支持文件上传
持久化cookie到SharedPreferences,个人感觉这一点也是这个库的重要特点,可以很方便的完成一些模拟登录
支持json
支持HTTP Basic Auth

用这个安卓客户端网络通信请求库的时候,首先注意
在Mainifest.xml里面添加一条网络权限许可(事实上只要与网络通信有关这条代码都要加上,这里提醒一下)
具体使用方法参见上面的代码;主要的几个步骤如下:               // 1.创建异步请求的客户端对象
               AsyncHttpClient client = new AsyncHttpClient();                // 2.定义请求的地址
String url = "http://192.168.1.1:8080/GourmetOrderServer/loginServlet?name=jun&paw=123456";
// 3.创建请求参数的封装的对象
RequestParams params = new RequestParams();
// 4.设置请求的参数名和参数值
params.put("username", userName);
// 5.设置请求的参数名和参数
params.put("userpass", userPass);
                //6.执行post方法
client.post(url, params, new AsyncHttpResponseHandler() {
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
 if (statusCode == 200) {     
                }  
}
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
}
});
}
其他有什么问题或者想具体了解详细说明,可以参考官网  http://loopj.com/android-async-http/其他参考链接   http://blog.csdn.NET/redarmy_chen/article/details/26980613              http://blog.csdn.net/hil2000/article/details/13949513[code] 对服务器返回json数据的处理:http://blog.csdn.net/hil2000/article/details/13949513
http://blog.csdn.net/yanbober/article/details/45307549
              http://www.cnblogs.com/hawkon/p/3593709.html
http://www.cnblogs.com/angeldevil/p/3729808.html
             http://my.oschina.net/u/1246663/blog/196971
            http://www.tuicool.com/articles/mqme2e[/code]也可以参考我的另外两篇博文,我也是在边学习,然后边记录下这些 
                                            
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: