设为首页 加入收藏

TOP

HttpURLConnection,HttpClient,Volley(一)
2015-07-16 12:57:32 来源: 作者: 【 】 浏览:14
Tags:HttpURLConnection HttpClient Volley

继承关系:
java.lang.Object
-java.net.URLConnection
-java.net.HttpURLConnection
HttpURLConnection继承自URLConnection,可以使用HTTP协议发送接收网络数据。可以接收发送提前不知道长度的数据。


其使用方式参考如下模式:
1.通过调用 URL.openConnection() 方法获得一个 URLConnection,并将其转为HttpURLConnection对象。
2.准备request请求,request的首要属性是它的URI。request 头还可以包括例如整数,首选内容类型,会话cookies等这些元数据。
3.也可以选择上传request body.(必须设定setDoOutput(true)),然后通过URLConnection.getOutputStream()返回的 OutputStream 发送出去。
4.读取response。response header一般包含一些元数据,比如response body的内容类型和长度,修改时间,会话cookies。response body可以通过URLConnection.getInputStream()方法返回的InputStream中读取。如果response没有body。URLConnection.getInputStream()返回一个空的stream。
5.关闭连接,一旦response body被读取完毕,HttpURLConnection应该通过disconnect()方法来关闭,从而释放连接所持有的资源。


典型示例代码:


代码中并没有步骤3.


示例代码:


Layout


AndroidManifest.xml 别忘了添加权限


效果图:


这里写图片描述


HttpURLConnection是Java的网络库的类,而HttpClient是 Apache Jakarta Common 下的子项目,可以用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。


HttpClient相对HttpURLConnection功能更加完善易用,主要特点如下:
(1)实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
(2)支持自动转向
(3)支持 HTTPS 协议
(4)支持代理服务器等


GET:
1. 创建 HttpClient 的实例
2. 创建某HttpGet。在创建时传入待连接的地址
3. 调用HttpClient实例的 execute 方法来执行第二步中创建好的实例
4. 读 response
5. 释放连接。无论执行方法是否成功,都必须释放连接
6. 对得到后的内容进行处理
POST:
1. 创建 HttpClient 的实例
2. 创建HttpPost对象。调用setParams(HetpParams params),setEntity(HttpEntity entity)方法来设置请求参数
3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例
4. 读 response,getAllHeaders(),getEntity()等
5. 释放连接。无论执行方法是否成功,都必须释放连接
6. 对得到后的内容进行处理


上面代码展示了使用GET和POST两种方式来完成HTTP会话过程。更多信息可以参考apache的网站上的资源:
HttpClient Tutorial (http://hc.apache.org/httpcomponents-client-4.4.x/tutorial/html/index.html)
HttpClient API文档:http://hc.apache.org/httpcomponents-client-ga/httpclient/apidocs/


因为Android中集成了HttpClient,所以我们可以直接使用HttpClient来进行网络编程。使用HttpClient直接加载一个图片实在是有点杀鸡用牛刀,因为HttpClient还可以实现用户登陆,维持和服务器之间的Session。不过为了简单期间,我们还是实现一个如上面的下载图片并显示在ImageView中的例子,还是以Get为例。


HttpClient使用起来同样是发送Request,接收response。


注:由于我的开发环境中Android自带的是3.X的httpClient。上面讲的例子是4.3的httpClient,API有所区别。如果需要使用最新的httpClient,可以自行下载jar包导入
下载:http://hc.apache.org/downloads.cgi 里面有个HttpClient for Android 4.3.5 (GA) 版本。不过是源码,自行编译成Jar即可。
如果使用老版本的httpClient问题也不大,只是API不太一样了,下面的示例代码使用的是HttpClient for Android 4.3.5。
示例代码:


代码相对HttpURLConnection变化很小,效果图和HttpURLConnection一致。


Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。它简化了http操作,并且加入了对异步加载图片的使用。Volley的实现中同样提供了上面提到的HttpURLConnection和HttpClient可供选择定制。官方推荐在API level = 9之前使用HttpClient,而之后使用HttpURLConnection。
具体使用的官方教程请参考:http://developer.android.com/training/volley/index.html


对于Volley的代码实现解析请参考:
“http://www.codekk.com/open-source-project-analysis/detail/Android/grumoon/Volley 源码解析”


虽然对于Volley来说,加载图片轻而易举,甚至它还提供了NetworkImageView这个自定义的ImageView来简化这一操作:


上面的ImageCache可以参考官方实现,摘要如下:


如果有一个问题就是其是在内存中做的缓存,当请求的图片过大的时候,容易发生OOM问题,而且缓存也不可能做的过大,所以自己实现的时候可以实现一个Disk+内存双重缓存的方式来做,做一个LruMemCache和LruDiskCache,在LruMemCache满了的时候trim到LruDiskCache。get的时候先从LruMemCache找,找不到则从ruDiskCache中找,再找不到则从网络下载,并加入到LruMemCache中。
说到底Volley并不是专门设计用来下载加载网络图片的。如果有大量图片加载任务,可以考虑使用Android-Universal-Image-Loader (https://github.com/nostra13/Android-Universal-Image-Loader) 它在内存缓存和硬盘缓存的管理做的更好。


Volley更擅长的是将一系列各种请求加入到异步网络请求队列。大大的提高了网络请求的销量和使用的便捷性,比如JsonReques。StringRequest。

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇JavaScript中常见的数组操作函数.. 下一篇C++ 新标准下的强制类型转换详解

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: