[置顶] 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
需要关闭keepAlive
:System.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 9.0 源码编译Android Car Automotive
- Android 2.2.2到Android 4.2.2源码下载地址
- SQLiteDatabase 启用事务源码分析
- Android下图片或按钮等可拖动到任意位置的效果实现源码
- Android查看源码
- android关于getLayoutParams()方法源码译文(部分)
- android TextToSpeech 源码分析
- 【30篇突击 android】源码统计七
- 获取 + 查看 Android 源码的 方法