与等效的iOS实现相比,HttpURLConnection非常慢

时间:2014-03-18 16:21:42

标签: android xml performance network-programming

我正在为iOS和Android编写应用程序,两者都是原生的(没有PhoneGap,没有Titanium)。应用程序的一般行为是从服务器获取XML文件,解析它,并根据其内容获取一些其他XML文件以及下载一些额外的数据文件(PDF,图像等)。这有点像RSS。

iOS上的初始加载(当我清除本地缓存以便一切都必须被拉下来时)大约需要20秒。主要馈送不到1秒,其余内容为19或20。

在Android上,大约需要两分钟

现在,早在我发现XML解析是一个很大的问题,所以我删除了XmlPullParser并编写了一个SAX解析器,加快了一点(一个XML文件从20秒开始解析为2,这仍然很慢与iOS相比)。但是,现在XML解析不是性能的一个因素,网络性能正在扼杀我。

我用Google搜索并发现了很多线程。我尝试过一系列不同的方法,其中没有一种做过任何事情,感觉就像猜测而不是工程。

例如,我已经这样做了:

System.setProperty("java.net.preferIPv4Stack", "true");
System.setProperty("http.keepAlive", "false");

在我的HttpURLConnection上,我将它设置为使用NO_PROXY和更短的连接超时,并禁止缓存。

HttpURLConnection c = (HttpURLConnection) url.openConnection(Proxy.NO_PROXY);
c.setConnectTimeout(1000);
c.setUseCaches(false);

没有人帮忙!

显然,Android的网络堆栈可以正常工作,而且运行速度很快 - 我使用的各种Android应用程序都非常快速。显然,我做错了什么。但是什么?

请帮助。我在这里结束了。

1 个答案:

答案 0 :(得分:0)

我没有解决这个问题,但我已经知道发生了什么。 这是延迟。

  1. Android的HttpURLConnection显然有一个破坏的http keep-alive implementation
  2. 可能与上述问题有关,http流水线无法正常工作
  3. 我在一个AsyncTask中同步进行URL连接 - 我尝试了各种方法来加快速度,就像一个接一个地完成所有连接一样,将响应主体保存在内存中并稍后处理。从2或3分钟加速到1.5左右,但这仍然是不可接受的。

    在最后的绝望中,我尝试了AsyncHttpClient

    并且圣洁的抽烟,现在整个下载大约需要20秒,就像在iOS上一样。

    所以,明智的话:如果你的Android应用程序为服务做了很多GET,并且你不能重写那个服务以将那些GET分成一个大批量(我不能在这里)你不要想要使用Android的HttpUrlConnection。使用AsyncHttpClient。

    不幸的是,AsyncHttpClient的结构类似于AFNetworking,这在Java上比在ObjectiveC中更加尴尬。所以需要一些指导。但它的效果非常好。