在实际开发中,有的时候需要频繁的网络请求,而网络请求的方式很多,最常见的也就那么几个。本篇文章对常见的网络请求库进行一个总结。

一、使用HttpUrlConnection:

1. HttpUrlConnection

最开始学android的时候用的网络请求是HttpUrlConnection,当时很多东西还不知道,但是在android2.2及以下版本中HttpUrlConnection存在着一些bug,所以建议在android2.3以后使用HttpUrlConnection,之前使用HttpClient。

注:在Android2.2版本之前,HttpClient拥有较少的bug,因此使用它是最好的选择。而在Android2.3版本及以后,HttpURLConnection则是最佳的选择。它的API简单,体积较小,因而非常适用于Android项目。压缩和缓存机制可以有效地减少网络访问的流量,在提升速度和省电方面也起到了较大的作用。对于新的应用程序应该更加偏向于使用HttpURLConnection,因为在以后的工作当中我们也会将更多的时间放在优化HttpURLConnection上面。

2. HttpUrlConnection特点

  • 比较轻便,灵活,易于扩展

  • 在3.0后以及4.0中都进行了改善,如对HTTPS的支持

  • 在4.0中,还增加了对缓存的支持

3. HttpUrlConnection用法:

(1)首先我们需要获取到一个HttpURLConnection实例,一般需要new出一个URL对象,并传入目标网络地址,通过调用openConnection()方法获得HttpURLConnection实例。

(2)得到该实例后。我们需要设置一下http请求的的方法,这里我们主要研究get和post,默认是使用get方法。get一般用于从服务器获取数据,post一般用于向服务器提交数据,设置请求方法使用函数setRequestMethod(“POST”)进行设置。

(3)此外可以进行一些请求的限制,比如连接超时的时间等,可以通过setConnectTimeout设置超时时间。

(4)获取服务器返回的输入流,使用getInputStream方法获取。

(5)读取内容并处理

(6)关闭连接,通过调用disconnect方法关闭当前的连接。

关键代码如下:

      使用过程中不要忘记添加权限

 <uses-permission android:name="android.permission.INTERNET"/>

 • GET

 public String get(String urlPath) {
HttpURLConnection connection = null;
InputStream is = null;
try {
URL url = new URL(urlPath);
//获得URL对象
connection = (HttpURLConnection) url.openConnection();
//获得HttpURLConnection对象
connection.setRequestMethod("GET");
// 默认为GET
connection.setUseCaches(false);
//不使用缓存
connection.setConnectTimeout(10000);
//设置超时时间
connection.setReadTimeout(10000);
//设置读取超时时间
connection.setDoInput(true);
//设置是否从httpUrlConnection读入,默认情况下是true;
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
//相应码是否为200
is = connection.getInputStream();
//获得输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//包装字节流为字符流
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
return response.toString();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.disconnect();
connection = null;
}
if (is != null) {
try {
is.close();
is = null;
} catch (IOException e) {
e.printStackTrace();
}
}
}
return null;
}

• POST

 private String post(String urlPath, Map<String, String> params) {
if (params == null || params.size() == 0) {
return get(urlPath);
}
OutputStream os = null;
InputStream is = null;
HttpURLConnection connection = null;
StringBuffer body = getParamString(params);
byte[] data = body.toString().getBytes();
try {
URL url = new URL(urlPath);
//获得URL对象
connection = (HttpURLConnection) url.openConnection();
//获得HttpURLConnection对象
connection.setRequestMethod("POST");
// 设置请求方法为post
connection.setUseCaches(false);
//不使用缓存
connection.setConnectTimeout(10000);
//设置超时时间
connection.setReadTimeout(10000);
//设置读取超时时间
connection.setDoInput(true);
//设置是否从httpUrlConnection读入,默认情况下是true;
connection.setDoOutput(true);
//设置为true后才能写入参数
connection.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Length", String.valueOf(data.length));
os = connection.getOutputStream();
os.write(data);
//写入参数
if (connection.getResponseCode() == HttpURLConnection.HTTP_OK) {
//相应码是否为200
is = connection.getInputStream();
//获得输入流
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
//包装字节流为字符流
StringBuilder response = new StringBuilder();
String line;
while ((line = reader.readLine()) != null) {
response.append(line);
}
return response.toString();
}
} catch (Exception e) {
e.printStackTrace();
} finally {
//关闭
if (os != null) {
try {
os.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (is != null) {
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (connection != null) {
connection.disconnect();
connection = null;
}
}
return null;
} private StringBuffer getParamString(Map<String, String> params) {
StringBuffer result = new StringBuffer();
Iterator<Map.Entry<String, String>> iterator = params.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, String> param = iterator.next();
String key = param.getKey();
String value = param.getValue();
result.append(key).append('=').append(value);
if (iterator.hasNext()) {
result.append('&');
}
}
return result;
}

二、使用HttpClient(使用类似于浏览器输入网址,浏览网页的过程)

1. HttpClient特点:

高效稳定,但是维护成本高昂,故android 开发团队不愿意在维护该库,而是转投更为轻便的HttpUrlConnection。

2. HttpClient用法:

(1)HttpClient是一个接口,因此无法直接创建它的实例,一般都是创建一个DefaultHttpClient实例.

(2)如果要发起Get请求,需要创建一个HttpGet对象,并传入请求地址

(3)如果要发起Post请求,需要创建一个HttpPost对象。并传入请求地址,通过setEntity函数设置请求参数

(4)调用execute方法,传入HttpGet或者HttpPost实例,执行后返回HttpResponse对象,判断响应状态码

(5)解析响应结果,通过调用getEntity函数获得一个HttpEntity对象,之后可以通过EntityUtils.toString方法将其转换为字符串

       由于在android2.3之后就被HttpUrlConnection取代了,这里也不过多介绍了,不过当初学习它的时候还没接触到其他库,就感觉它好方便,下面简单贴出使用方法:

• GET

 private String get(String url){
HttpClient client=null;
HttpGet request=null;
try {
client=new DefaultHttpClient();
request=new HttpGet(url);
HttpResponse response=client.execute(request);
if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
String result=EntityUtils.toString(response.getEntity(),"UTF-8");
return result;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

• POST

 private String post(String url,List<NameValuePair> params){
HttpClient client=null;
HttpPost request=null;
try {
client=new DefaultHttpClient();
request=new HttpPost(url);
request.setEntity(new UrlEncodedFormEntity(params, HTTP.UTF_8));
HttpResponse response=client.execute(request);
if(response.getStatusLine().getStatusCode()== HttpStatus.SC_OK){
String result=EntityUtils.toString(response.getEntity(),"UTF-8");
return result;
}
} catch (IOException e) {
e.printStackTrace();
}
return null;
}

三、使用Android Asynchronous Http Client(开源项目组件)

Android Asynchronous Http Client一看名字就知道它是基于Http Client的,但是呢在安卓中Http Client已经废弃了,所以也不建议使用这个库了。然后仍然有一些可取的内容值得学习,所以这里也介绍一下。

1. Android Asynchronous Http Client特点:

  • 所以请求在子线程中完成,请求回调在调用该请求的线程中完成

  • 使用线程池

  • 使用RequestParams类封装请求参数

  • 支持文件上传

  • 持久化cookie到SharedPreferences,个人感觉这一点也是这个库的重要特点,可以很方便的完成一些模拟登录

  • 支持json

  • 支持HTTP Basic Auth

2. 用法:

(1)编写一个静态的HttpClient,如下:

 public class TestClient {
private static final String BASE_URL =
"http://121.41.119.107/"; private static AsyncHttpClient client =
new AsyncHttpClient(); public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.get(getAbsoluteUrl(url), params, responseHandler);
} public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {
client.post(getAbsoluteUrl(url), params, responseHandler);
} private static String getAbsoluteUrl(String relativeUrl) {
return BASE_URL + relativeUrl;
}
}

(2)调用get或者post方法,参数通过RequestParams传递,没有参数则传递null

 RequestParams  params = new RequestParams();
params.put("","");

(3)如果要保存cookie,在发起请求之前,调用一下代码:

 PersistentCookieStore myCookieStore = new PersistentCookieStore(this);
client.setCookieStore(myCookieStore);

之后请求所得到的cookie都会自动持久化

如果要自己添加cookie,则调用以下代码:

 BasicClientCookie newCookie = new BasicClientCookie("cookiesare", "awesome");
newCookie.setVersion(1);
newCookie.setDomain("mydomain.com");
newCookie.setPath("/");
myCookieStore.addCookie(newCookie);

(4)使用回调函数中处理返回的结果:

 private void get(){
TestClient.get("test/index.php", null, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { } @Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { }
});
}
private void post(){
RequestParams params = new RequestParams();
params.put("user","asas");
params.put("pass","12121");
params.put("time","1212121");
TestClient.post("test/login.php", params, new AsyncHttpResponseHandler() {
@Override
public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) { } @Override
public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) { }
});
}

Android进阶笔记01:Android 网络请求库的比较及实战(一)的更多相关文章

  1. Android进阶笔记02:Android 网络请求库的比较及实战(二)

    一.Volley        既然在android2.2之后不建议使用HttpClient,那么有没有一个库是android2.2及以下版本使用HttpClient,而android2.3及以上版本 ...

  2. [转]Android各大网络请求库的比较及实战

    自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...

  3. Android 各大网络请求库的比较及实战

    自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...

  4. Android进阶(一)几种网络请求方式详解

    Ref:http://blog.csdn.net/zuolongsnail/article/details/6373051 Android应用经常会和服务器端交互,这就需要手机客户端发送网络请求,下面 ...

  5. 浅论Android网络请求库——android-async-http

    在iOS开发中有大名鼎鼎的ASIHttpRequest库,用来处理网络请求操作,今天要介绍的是一个在Android上同样强大的网络请求库android-async-http,目前非常火的应用Insta ...

  6. Android之网络请求库

    自己学习android也有一段时间了,在实际开发中,频繁的接触网络请求,而网络请求的方式很多,最常见的那么几个也就那么几个.本篇文章对常见的网络请求库进行一个总结. HttpUrlConnection ...

  7. Retrofit网络请求库应用01

    PS:什么是Retrofit? 在官方文档中有这样一句话--A type-safe HTTP client for Android and Java(一个类型安全的http client库),具体的话 ...

  8. Android进阶笔记:Messenger源码详解

    Messenger可以理解为一个是用于发送消息的一个类用法也很多,这里主要分析一下再跨进程的情况下Messenger的实现流程与源码分析.相信结合前面两篇关于aidl解析文章能够更好的对aidl有一个 ...

  9. Android进阶笔记:AIDL内部实现详解 (二)

    接着上一篇分析的aidl的流程解析.知道了aidl主要就是利用Ibinder来实现跨进程通信的.既然是通过对Binder各种方法的封装,那也可以不使用aidl自己通过Binder来实现跨进程通讯.那么 ...

随机推荐

  1. delphi 2010 动态链接库DLL断点调试

    DELPHI 2010 动态链接库DLL断点调试 马根峰 (广东联合电子服务股份有限公司,广州 510300) 摘要:本文详细介绍了Delphi 2010中的动态链接库DLL断点调试技术 关键词:DE ...

  2. NodeJs开发学习目录

    1.Nodejs基本概念及Nodejs.npm安装测试[2014-06-06] 2.开发工具简介(主要介绍Sublime Text使用) [2014-06-06] 3.Sublime text插件安装 ...

  3. HDU 1996

    Problem Description n个盘子的汉诺塔问题的最少移动次数是2^n-1,即在移动过程中会产生2^n个系列.由于发生错移产生的系列就增加了,这种错误是放错了柱子,并不会把大盘放到小盘上, ...

  4. Python 日期格式化 及 schwartzian排序

    __author__ = 'root' import datetime import time import copy # 12/Dec/2012:23:59:50 # 12/Sep/2012:23: ...

  5. JavaScript DES 加密

    最近做网页数据加密工作, 使用CryptoJS v3.1.2 这个JavaScript脚本,网上比较有质量的文章实在太少,经验证加密结果与Asp.net DES加密结果一致 参考文章 https:// ...

  6. GNU 网络程序

    ______________________________________________________________________________ | 版权声明 | | 1.本文可以转载.修 ...

  7. BZOJ 1055 玩具取名

    Description 某人有一套玩具,并想法给玩具命名.首先他选择WING四个字母中的任意一个字母作为玩具的基本名字.然后他会根据自己的喜好,将名字中任意一个字母用“WING”中任意两个字母代替,使 ...

  8. 通过 IDE 向 Storm 集群远程提交 topology

    转载: http://weyo.me/pages/techs/storm-topology-remote-submission/ http://www.javaworld.com/article/20 ...

  9. JSP出现中文乱码问题

    今天纠结了好半天,本地运行程序后没有中文乱码,唯独发到服务器后运行出现了乱码. 究其原因,皆因eclipse环境默认的JSP编码是Iso-8859-1,需要将其改为utf-8,与JSP文件中的编码声明 ...

  10. Delphi重载,覆盖,多态

    一.override 重载 type TFigure = class procedure Draw; virtual;//(我的理解是)父类中可以使用父类的,子类中使用子类的.与“四”是有区别的. e ...