Android网络编程

1、3种主要接口


1.1、Java接口


提供与联网有关的类,包括流、数据包套接字(socket)、Internet协议、常见Http处理等。比如:创建URL,以及URLConnection/HttpURLConnection对象、设置链接参数、链接到服务器、向服务器写数据、从服务器读取数据等通信。这些在Java网络编程中均有涉及。


1.2、Apache接口


对于大部分应用程序而言JDK本身提供的网络功能已远远不够,这时就需要Apache HttpClient了。它是一个开源项目,功能更加完善,为客户端的Http编程提供高效、最新、功能丰富的工具包支持。


1.3、Android接口


常常使用此包下的类进行Android特有的网络编程,如:访问WiFi,访问Android联网信息,邮件等功能。


2、种访问方式


2.1、HttpURLConnection


HttpURLConnection是一种多用途、轻量极的HTTP客户端,使用它来进行HTTP操作可以适用于大多数的应用程序。虽然HttpURLConnection的API提供的比较简单,但是同时这也使得我们可以更加容易地去使用和扩展它。

不过在Android 2.2版本之前,HttpURLConnection一直存在着一些令人厌烦的bug。比如说对一个可读的InputStream调用close()方法时,就有可能会导致连接池失效了


2.2、HttpClient


DefaultHttpClient和它的兄弟AndroidHttpClient都是HttpClient具体的实现类,它们都拥有众多的API,而且实现比较稳定,bug数量也很少。但同时也由于HttpClient的API数量过多,使得我们很难在不破坏兼容性的情况下对它进行升级和扩展,所以目前Android团队在提升和优化HttpClient方面的工作态度并不积极。

3、6种网络框架


HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生:


3.1、AsyncHttpClient


核心类,使用HttpClient执行网络请求,提供了get,put,post,delete,head等请求方法,使用起来很简单,只需以url及RequestParams调用相应的方法即可,还可以选择性地传入Context,用于取消Content相关的请求,同时必须提供ResponseHandlerInterface(AsyncHttpResponseHandler继承自ResponseHandlerInterface)的实现类,一般为AsyncHttpResponseHandler的子类,AsyncHttpClient内部有一个线程池,当使用AsyncHttpClient执行网络请求时,最终都会调用sendRequest方法,在这个方法内部将请求参数封装成AsyncHttpRequest(继承自Runnable)交由内部的线程池执行。

  • 步骤

创建一个AsyncHttpClient;
(可选的)通过RequestParams对象设置请求参数;
调用AsyncHttpClient的某个get方法,传递你需要的(成功和失败时)callback接口实现,一般都是匿名内部类,实现了AsyncHttpResponseHandler,类库自己也提供了好些现成的response handler,你一般不需要自己创建一个。

  • 特点
  1. 发送异步http请求,在匿名callback对象中处理response;
  2. http请求发生在UI线程之外;
  3. 内部采用线程池来处理并发请求;
  4. GET/POST 参数构造,通过RequestParams类。
  5. 内置多部分文件上传,不需要第三方库支持;
  6. 流式Json上传,不需要额外的库;
  7. 能处理环行和相对重定向;
  8. 和你的app大小相比来说,库的size很小,所有的一切只有90kb;
  9. 自动智能的请求重试机制在各种各样的移动连接环境中;
  10. 自动的gzip响应解码;
  11. 内置多种形式的响应解析,有原生的字节流,string,json对象,甚至可以将response写到文件中;
  12. 永久的cookie保存,内部实现用的是Android的SharedPreferences;
  13. 通过BaseJsonHttpResponseHandler和各种json库集成;
  14. 支持SAX解析器;
  15. 支持各种语言和content编码,不仅仅是UTF-8。


3.2、Volley

 

  • 特点
  1. 自动调度网络请求
  2. 多个并发的网络连接
  3. 通过使用标准的HTTP缓存机制保持磁盘和内存响应的一致
  4. 支持请求优先级
  5. 支持取消请求的强大API,可以取消单个请求或多个
  6. 易于定制
  7. 健壮性:便于正确的更新UI和获取数据
  8. 包含调试和追踪工具
  • 优点:
  1. 默认Android2.3及以上基于HttpURLConnection,2.3以下使用基于HttpClient;
  2. 符合Http 缓存语义 的缓存机制(提供了默认的磁盘和内存等缓存);
  3. 请求队列的优先级排序;
  4. 提供多样的取消机制;
  5. 提供简便的图片加载工具(其实图片的加载才是我们最为看重的功能);
  6. 一个优秀的框架 。
  • 缺点:
  1. 它只适合数据量小,通信频繁的网络操作,如果是数据量大的,像音频,视频等的传输,还是不要使用Volley的为好。

3.3、OkHttp


OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存。默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题。如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求。Retrofit使用GSON解析JSON数据。OKHttp与HttpUrlConnection一样,都是面向java的,而且是做socket层的事情的,使用时要在子线程调用,通过handler发送结果到主线程。
而NoHttp和Volley不是做socket层的东西。直接在主线程就可以调用,拿到结果后直接更新UI,不需要用handler去发送, 很简单。

3.4、NoHttp


封装了文件下载、断点续传、304缓存、302/303传参数、传文件、请求头、多文件上传、大文件上传、Cookie自动管理等多种功能,这些是Volley而没有,使用Volley时这些功能要我们去写蛮多代码来再次封装。而且Volley用的HttpClient来解析的,Android6.0删除了HttpClient后,我们在6.0下也不能使用Volley的源码了,所以还是用NoHttp吧,NoHttp兼容2.0-6.0以上。而使用OkHttp还需要我们自己去封装, 而且Android4.4之后NoHttp也是使用OkHttp做底层的。

3.5、Retrofit


A type-safe REST client for Android and Java Retrofit简化了从Web API下载数据,解析成普通的Java对象(POJO)。
和OkHttp都是square团队开发的。Retrofit是一套RESTful架构的Android(Java)客户端实现,基于注解,提供JSON to POJO(Plain Ordinary Java Object,简单Java对象),POJO to JSON,网络请求(POST,GET,PUT,DELETE等)封装。

  Retrofit 和Java领域的ORM概念类似, ORM把结构化数据转换为Java对象,而Retrofit 把REST API返回的数据转化为Java对象方便操作。同时还封装了网络代码的调用。

3.6、android-async-http

android-async-http是基于Apache HttpClient专门用于android的异步http请求,所有的请求都在非UI线程执行。API比较全面,使用比较简单,而且在CallBack中使用了Handler消息机制,我们可以在回调方法onSuccess,onFailure等中直接对UI进行操作。 

  • 功能
  1. 用HttpClient代替Android提供的DefaultHttpClient;
  2. 兼容Android API 23以及更高;
  3. 发送异步http请求,在匿名的callback对象中处理response信息;
  4. 在非UI线程执行http请求;
  5. 使用线程池处理并发请求;
  6. RequestParams作为GET/POST参数构造器;
  7. 多部件文件上传,不需要引入第三方库;
  8. JSON数据流上传,不需要引入库;
  9. 能处理循环行和相对重定向;
  10. 对应用来说库很小,总共只有90KB;
  11. 使多种多样的移动连接具备良好自动智能请求重试机制;
  12. 支持超快速请求的自动gzip响应解码;
  13. BinaryHttpResponseHandler支持二进制通讯协议;
  14. 通过JsonHttpResponseHandler实现内置解析response成JSON格式;
  15. 通过FileAsyncHttpResponseHandler实现直接将response写入保存到文件中;
  16. 持久化的cookie存储,将cookie保存到应用程序的SharePreferences中;
  17. 通过BaseJsonHttpResponseHandler集成Jackson Json,Gson和其他的JSON序列化库;
  18. 通过SaxAsyncHttpResponseHandler支持SAX解析;
  19. 支持各种语言和内容编码,不是只有UTF-8;

4、小结


如果是标准的RESTful API,那么用Retrofit会非常爽!网络交互部分代码量可以减少90%。同时支持Gson,契合度很高。
另外,Retrofit和okhttp是亲兄弟,建议一起用,okhttp是底层库,能够支持一些非标准的HTTP方法,比如PATCH方法。

Volley自己的定位是轻量级网络交互,适合大量的,小数据传输,如果你的项目比较大,那么目测还得把volley再次封装才会好用一些。

android-async-http这个库比较老了,用的人不多了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值