官方说明
简要总结
- HTTP Client拥有庞大而灵活地APIs,实现很稳定,正因为此,我们很难在不破坏兼容性的前提下对其进行优化,Android团队也没有积极开发HTTP Client;
- HttpURLConnection是一个适用于大多数应用程序的通用轻量级HTTP客户端。这个类起初体量不大,但其专注的API使我们能够轻松提升其稳定性。
- 在Froyo(2.2)之前的版本中,HttpURLConnection有许多令人崩溃的错误。尤其是在一个可读的InputStream中调用close()会堵死连接池。通过禁用连接池解决此问题:
private void disableConnectionReuseIfNecessary() {
// HTTP connection reuse which was buggy pre-froyo
if (Integer.parseInt(Build.VERSION.SDK) < Build.VERSION_CODES.FROYO) {
System.setProperty("http.keepAlive", "false");
}
- 在Gingerbread(2.3)中,我们添加了transparent response compression(透明响应压缩)。 HttpURLConnection将自动将此标头添加到传出请求,并处理相应的响应:
Accept-Encoding: gzip
我们还在Gingerbread中对HTTPS进行了一些改进。 HttpsURLConnection尝试连接服务器名称指示(SNI),允许多个HTTPS主机共享IP地址。它还支持压缩和session tickets。如果连接失败,则会在没有这些功能的情况下自动重试。这使得连接到最新服务器时HttpsURLConnection有效,而不会破坏与旧服务器的兼容性。
- 在Ice Cream Sandwich(4.0)中,HttpsURLConnection增加了响应缓存。
Which client is best?
- Apache HTTP客户端在Eclair和Froyo上有更少的错误。 它是这些版本的最佳选择。
- 对于Gingerbread和之后的版本,HttpURLConnection是最好的选择。 它的简单的API和小尺寸使它非常适合Android。 透明压缩和响应缓存减少网络使用,提高速度和节省电池。 新的应用程序应该使用HttpURLConnection; 值得我们继续投入精力。