在非常慢的2G互联网上下载xml数据

时间:2014-05-23 21:08:33

标签: java android xml

我已经成功编写了一个应用程序,每隔10秒就可以获得一系列系统服务(GPS位置,网络位置,wifi,neighbouringcellinfo,传感器......)的痕迹,效果非常好,但是一旦限制了在我的手机上互联网仅使用2G并关闭Wifi我得到的应用仍然有效,但开始滞后。

我试图找出问题的来源,我注意到它来自这个代码行:

XmlPullParser receivedData = XmlPullParserFactory.newInstance()
                    .newPullParser().setInput(xmlUrl.openStream(), null); return receivedData; 

一旦我在我的活动中删除了这几行代码,应用程序就可以运行而不会滞后,但看到它们对我的应用程序至关重要,我非常希望让它们工作(他们已经做过)但不会造成滞后

有人可以帮助我吗?

我已经从XML文件中打印出解析后的结果,这是正确的,所以我唯一的问题是应用程序的滞后。

我要处理的典型XML文件如下所示:

<rsp stat="ok">
<cell lat="49.88415658974359" lon="8.637537076923078" mcc="262" mnc="7" lac="41146" 
cellid="42404" averageSignalStrength="-79" samples="39" changeable="1"/>
</rsp>

2 个答案:

答案 0 :(得分:1)

2g是一些非常慢的连接。更糟糕的是天线的“热身”。在收到第一位之前,它可能持续长达30秒。 (而且你无法对此做些什么,因为这完全是关于物理学的。)

所以你唯一能做的就是在后台加载文件 - 线程。这将使appp响应(如果你不需要及时的数据)。

答案 1 :(得分:1)

Mayb显式为BufferedInputStream

XmlPullParser receivedData = XmlPullParserFactory.newInstance()
                .newPullParser().setInput(xmlUrl.openStream(), null);

XmlPullParser receivedData = XmlPullParserFactory.newInstance()
                .newPullParser().setInput(
                    new BufferedInputStream(xmlUrl.openStream()), null);

也许,可能是压缩

正如您在HTTP中所知,浏览器可以在其标头中声明它可以decompress压缩数据;然后服务器可以发送HTML的压缩版本。这可以减轻服务器端的负担,可以加速通信,具体取决于。

同一个人可以做自己。

对于外部不受控制的网站,可以尝试。发送标题

Accept-Encoding: gzip

当收到回复标题时,一个人很幸运:

Content-Encoding: gzip

通过包裹溪流来做自己的方式:

outputStream = new GZipOutputStream(outputStream);

inputStream = new GZipImüputStream(inputStream);

节省内存 使相同的字符串实例独特可以减少内存并可能有所帮助,即使它本身也需要相当长的时间。 String.intern()是个坏主意,因为在java 8之前,字符串会进入永久(不可恢复的)内存空间。可以使用

private Map<String, String> identityMap = new HashMap<>();

public String unique(String s) {
    if (s.length() >= 30) {
        return s;
    }
    String t = identityMap.get(s);
    if (t == null) {
        t = s;
        identityMap.put(s, t);
    }
    return t;
}

希望是,处理变得更快。