安卓客户端与后台进行通信有两种办法,即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
也可以参考我的另外两篇博文,我也是在边学习,然后边记录下这些
代码下载链接,可运行,简单的登陆LOGOhttp://download.csdn.net/detail/bruce_shan/9401609