Android网络请求及各框架使用心得

作为一名Android开发人员,在日常开发中经常会与服务器端或设备端交互,这就需要了解APP端的网络请求,知己知彼,才能百战百胜;我们的倡导的是“偷懒”,而不重复造轮子,选择合适的网络请求框架,将助力于APP开发。

在实际开发中,网络请求的方式很多,但常见的也就那么几个。本文根据个人的经验对常见的网络请求库使用进行一个总结:

一、HttpClient

Android自带的网络请求API,但在android2.3之后就被开发团队抛弃了,因是系统API,之前使用的人还不少,即使浏览现在代码,有时还能看到这个接口的使用,网传是因为维护成本高昂而不愿意再维护。因之前有使用过,这里简单写下使用方法:

  • 创建HttpClient对象;
  • 如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象;
  • 如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HttpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数;
  • 调用HttpClient对象的execute(HttpUriRequest request)发送请求,执行该方法返回一个HttpResponse;
  • 调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。

因Google已经放弃,那我们就不再去深究。

二、AsyncHttpClient

AsyncHttpClient是基于HttpClient开发的,因为HttpClient被抛弃的原因,该作者放弃AsyncHttpClient维护也情由可原,没有使用过这个框架,不作过多评论。

三、HttpURLConnection

记得最开始学android,还不知道有什么网络框架可用,确实当时没有好的网络框架,所使用的网络请求都是直接使用系统API,HttpURLConnection,如HttpURLConnection是Java的标准类,它继承自URLConnection,可用于向指定网址发送GET请求、POST请求。

特点:

  • 比较轻便,灵活,易于扩展;
  • 在3.0后以及4.0中都进行了改善,如对HTTPS的支持;
  • 在4.0中,还增加了对缓存的支持。

用法

  • 首先我们需要获取到一个HttpURLConnection实例,一般需要new出一个URL对象,并传入目标网络地址,通过调用openConnection()方法获得HttpURLConnection实例;
  • 得到该实例后。我们需要设置一下http请求的的方法,这里我们主要研究get和post,默认是使用get方法。get一般用于从服务器获取数据,post一般用于向服务器提交数据,设置请求方法使用函数setRequestMethod(“POST”)进行设置;
  • 此外可以进行一些请求的限制,比如连接超时的时间等,可以通过setConnectTimeout设置超时时间;
  • 获取服务器返回的输入流,使用getInputStream方法获取;
  • 读取内容并处理;
  • 关闭连接,通过调用disconnect方法关闭当前的连接。

因属系统API,所以使用上都比较规范。

四、OkHttp

OkHttp是基于http协议封装的一套请求客户端,虽然它也可以开线程,但根本上它更偏向真正的请求,跟HttpClient, HttpUrlConnection的职责是一样的。

特点:

  • OKHttp是Android版Http客户端。非常高效,支持SPDY、连接池、GZIP和 HTTP 缓存;
  • 默认情况下,OKHttp会自动处理常见的网络问题,像二次连接、SSL的握手问题;
  • 如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求;
  • 从Android4.4开始HttpURLConnection的底层实现采用的是okHttp。

用法:

  • 新建一个OkHttpClient对象;
  • 通过Request.Builder对象新建一个Request对象;
  • 返回执行结果。

开发者不能直接使用OKHttp,需要根据业务逻辑再次封装。

五、Volley

Volly网络框架系Google出品,源码开放,可行进行二次封装和引用。在2014年第一次使用网络框架时就引入使用,因字符串的问题,还把部分源码拷贝,进行自定义修改使用。

特点:

  • Volley的优势在于处理小文件的http请求;
  • 在Volley中也是可以使用Okhttp作为传输层
  • Volley在处理高分辨率的图像压缩上有很好的支持;
  • NetworkImageView在GC的使用模式上更加保守,在请求清理上也更加积极,networkimageview仅仅依赖于强大的内存引用,并当一个新请求是来自ImageView或ImageView离开屏幕时 会清理掉所有的请求数据。

用法:

  • 创建一个RequestQueue对象;
  • 创建一个Request对象;
  • 将Request对象添加到RequestQueue里面。

在2014-2016年的项目开发中,基本上都使用Volley网络框架,但在2017年出现两个比较突出的问题:

  • 不能直接支持HTTPS,需要修改代码;
  • 网络请求响应慢;
  • 发现频繁的网络请求会出现堵塞的情况。

虽说Google出品,必属精品,但随时间的流逝,Volley有点跟不上时间的步伐,但我相信还是有不少项目仍在使用。
再次验证:再牛B的人都要学习,否则就会跟不上社会。

六、Retrofit

项目上为了解决上述的几个问题,换成Retrofit网络框架,效果还不错,只要写少量的业务逻辑代码,就可以实现要求。Retrofit是Square公司出品的默认基于 OkHttp封装的一套RESTful网络请求框架。
特点:

  • 性能最好,处理最快;
  • 使用REST API时非常方便;
  • 传输层默认就使用OkHttp;
  • 支持NIO;
  • 拥有出色的API文档和社区支持;
  • 速度上比volley更快;
  • 如果你的应用程序中集成了OKHttp,Retrofit默认会使用OKHttp处理其他网络层请求;
  • 默认使用Gson。

Retrofit支持同步和异步两种方式,在使用时,需要将请求地址转换为接口,通过注解来指定请求方法,请求参数,请求头,返回值等信息。还是使用之前的person的那段json值,get请求到服务器后从数据库查询数据,返回值为查询到的数据,post请求向服务器提交一条数据,返回值为提交的数据。

同步用法:

  • 首先完成请求所用的service,是一个interface,完全通过注解完成配置;
  • GET:使用时,通过RestAdapter的实例获得一个接口的实例,其本质是动态代理,注意含有返回值的方法是同步的,不能UI线程中调用,应该在子线程中完成;
  • POST的调用同Get,获得adapter后获得一个代理对象,然后通过这个代理对象进行网络请求

异步用法:

  • 如果要使用异步请求,需要将接口中的方法返回值修改会void,再加入回调参数Callback,就如PersonService中第三个方法一样,请求完成后会回调该callback对象的success或者fail方法。

当前主流应该是:Retrofit + OkHttp + RxJava。

七、RoboSpice

项目中没有用过RoboSpice,只能简单介绍下:RoboSpice是一个建立异步的长时间的运行任务异常轻松的一个网络库,在网络请求,缓存支持,和提供开箱即用的rest请求方面尤为强大。(后续有使用到再来补充下总结)

作为开发者,必须有一颗好奇心,对新技术的好奇,抱着好奇的心去学习和接受采用新出来的技术。