我正在为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应用程序都非常快速。显然,我做错了什么。但是什么?
请帮助。我在这里结束了。
答案 0 :(得分:0)
我没有解决这个问题,但我已经知道发生了什么。 这是延迟。
我在一个AsyncTask中同步进行URL连接 - 我尝试了各种方法来加快速度,就像一个接一个地完成所有连接一样,将响应主体保存在内存中并稍后处理。从2或3分钟加速到1.5左右,但这仍然是不可接受的。
在最后的绝望中,我尝试了AsyncHttpClient
并且圣洁的抽烟,现在整个下载大约需要20秒,就像在iOS上一样。
所以,明智的话:如果你的Android应用程序为服务做了很多GET,并且你不能重写那个服务以将那些GET分成一个大批量(我不能在这里)你不要想要使用Android的HttpUrlConnection。使用AsyncHttpClient。
不幸的是,AsyncHttpClient的结构类似于AFNetworking,这在Java上比在ObjectiveC中更加尴尬。所以需要一些指导。但它的效果非常好。