[置顶] Android如何选择HttpURLConnection和HttpClient

Android如何选择HttpURLConnection和HttpClient

技术交流1群:46523908
技术交流2群:46505645
NoHttp 源码及Demo:https://github.com/Y0LANDA/NoHttp

NoHttp是专门做Android网络请求与下载的框架。

便捷性

  从我刚开始接触Android时,那时Android已经发展到2.0了,Android请求网络的时候最流行的有两种Api供我们选择,一个是HttpURLConnection,另一个是Apache HttpClient。
  众所周知HttpURLConnection在2.2(Froyo)之前存在一个bug,调用close()函数会影响连接池,导致连接复用失效,所以在Froyo之前使用HttpURLConnection需要关闭keepAliveSystem.setProperty("http.keepAlive", "false");,而Apache Httpclient高效稳定,所以选择HttpClient的人较多,但是由于维护成本高昂,因此Android开发团队不愿意在维护该库而是转投更为轻便的HttpURLConnection。后来在Android4.4(KITKAT)时弃用了HttpClient,在Android6.0直接在SDK删除HttpClient的api,因此还是建议大家选择HttpURLConnection。

HttpURLConnection优化之启用缓存

  由于这个功能是在4.0之后的版本才有的,我们使用反射的方式来启动响应缓存功能。如何在Android 4.0及以后的版本中去启用响应缓存的功能,同时还不会影响到之前的版本:

try {
    long httpCacheSize = 10 * 1024 * 1024; // 10 MiB
    File httpCacheDir = new File(getCacheDir(), "http");
    Class<?> aClass = Class.forName("android.net.http.HttpResponseCache");
    aClass.getMethod("install", File.class, long.class).invoke(null, httpCacheDir, httpCacheSize);
} catch (IllegalAccessException e) {
} catch (InvocationTargetException e) {
} catch (NoSuchMethodException e) {
} catch (ClassNotFoundException e) {
}

HttpClient的Bug

  在Android SDk中HttpClient使用的是4.0beta2,这个版本里面有些蛋疼的Bug:
  在4.0上的sdk,将wifi和3g同时打开,理论上来说,网络接口应该走Wifi,但是却走了代理,导致访问服务器网络失败;
  解决的唯一办法就是引入http://code.google.com/p/httpclientandroidlib中的库,然后修改相应的类,典型的例子就是ThreadSafeClientConnManager变成了PoolingClientConnectionManager。

NoHttp底层使用的是什么?

  NoHttp底层最开始是用HttpClient,随着Android团队对HttpURLConnection的优化,NoHttp也改换为HttpURLConnection了,NoHttp这个框架的主旨是:小白和大神都能用Android开源网络框架。下面是它的特性:

  • 支持HTTP/HTTPS,自动维持Cookie,异步/同步请求,大文件/多文件上传,文件下载。
  • 支持304缓存,302/303重定向,支持通过代理服务器访问地址(如: Google)。
  • NoHttp是队列,自动为请求排队,可以取消指定请求, 可以取消队列所有请求,亦可以停止队列。
  • 支持请求String、Bitmap、JsonObject、可自定义扩展请求类型。
  • API使用简单,Request对象包涵参数、文件、请求头等;Response对象包涵响应内容,响应头等信息。

NoHttp和Volley的对比

  看过Volley的同学都知道,Volley请求网络时在Android2.3之前用的是HttpClien,在Android2.3之后用的是HttpConnection,但是连接完成后解析数据时都用的是HttpClient的Api,所以我们Android6.0以后再也无法使用Volley的源码了(依然可以使用jar包),并且随着Google放弃维护Volley,很多人也选择了NoHttp,下面是NoHttp和Volley的功能对比:

功能模块 NoHttp Volley 说明
请求队列 支持 支持 -
多级别取消请求 支持 支持 取消所有请求、取消指定的几个请求
与Activit联动 支持 支持 Activity结束时取消请求
调试模式 支持 支持 两者都仅要一句话控制是否调试
自定义请求类型 支持 支持 比如FastJson
上传文件 支持 不支持 NoHttp支持上传多个文件、大文件、上传进度等
异步请求 支持 支持 主线程请求,响应后直接更新UI
同步请求 支持 不支持 子线程同步请求
响应码304缓存 支持 支持 有大牛分析了Volley源码,Volley的304缓存模块存在bug
请求优先级 不支持 支持 -
响应码302/303重定向 支持 不支持 NoHttp拥有和浏览器一样的重定向功能,可多级重定向
使用代理请求 支持 不支持 -
自动管理Cookie 支持 不支持 HttpClient使用着的福音,NoHttp弥补了这一点
Https访问 支持 不支持 Volley需要开发者改Volley源码才能支持
打印请求过程 支持 支持 Volley的貌似不怎么友好

各位看官可以根据自身的情况选择使用。

NoHttp 源码及Demo:https://github.com/Y0LANDA/NoHttp

你可能感兴趣的:(源码,android,框架,网络,NoHttp)