【发布时间】:2014-03-18 16:21:41
【问题描述】:
我正在为 iOS 和 Android 编写一个应用程序,它们都是原生的(没有 PhoneGap,没有 Titanium)。该应用程序的一般行为是从服务器获取 XML 文件,对其进行解析,然后根据其内容获取一些其他 XML 文件以及下载一些额外的数据文件(PDF、图像等)。有点像 RSS。
iOS 上的初始加载(当我清除了本地缓存以使所有内容都被拉下时)大约需要 20 秒。主提要不到 1 秒,其余内容不到 19 或 20 秒。
在 Android 上,大约需要 两分钟。
现在,我很早就发现 XML 解析很受欢迎,所以我放弃了 XmlPullParser 并编写了一个 SAX 解析器,它加快了速度(一个 XML 文件从 20 秒解析到 2 秒,这仍然很慢与 iOS 相比)。但是,既然 XML 解析不再是影响性能的一个因素,那么网络性能就让我受不了了。
我已经用谷歌搜索并找到了很多关于这个的线程。我尝试了很多不同的方法,但都没有做任何事情,感觉更像是猜测而不是工程。
例如,我已经这样做了:
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 应用都非常快。很明显我做错了什么。但是什么?
请帮忙。我在这里束手无策。
【问题讨论】:
-
使用 Traceview 准确确定您的问题所在。
-
如果你想要性能,禁用缓存会适得其反。
-
@CommonsWare DDMS 的网络视图向我展示了我可以从日志中看到的内容 - 下载具有高带宽,但它们之间存在高延迟(或者可能在连接开始时开始之前)。它实际上并没有告诉我太多,但我承认我可能没有正确使用它。
-
@EJP 这就是我的想法,但我在这里看到的几十个帖子都建议禁用缓存来解决这个问题。
-
"DDMS 的网络视图" -- 我建议你使用 Traceview。 Traceview != 网络标签。
标签: android xml performance network-programming