Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/216.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 在速度非常慢的2G internet上下载xml数据_Java_Android_Xml - Fatal编程技术网

Java 在速度非常慢的2G internet上下载xml数据

Java 在速度非常慢的2G internet上下载xml数据,java,android,xml,Java,Android,Xml,我已经成功地编写了一个应用程序,每10秒钟记录一次系统服务分配(GPS位置、网络位置、wifi、NeiguringCellInfo、传感器等),效果非常好,但一旦我将手机上的互联网限制为仅使用2G并关闭wifi,我发现该应用程序仍然可以工作,但开始滞后 我试图找出问题的根源,并注意到它来自以下代码行: XmlPullParser receivedData = XmlPullParserFactory.newInstance() .newPullParser

我已经成功地编写了一个应用程序,每10秒钟记录一次系统服务分配(GPS位置、网络位置、wifi、NeiguringCellInfo、传感器等),效果非常好,但一旦我将手机上的互联网限制为仅使用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>

2g是一种非常慢的连接。更糟糕的是天线的“预热”。在接收到第一位之前,它可能会持续30秒。(事实上,你无法对此采取任何措施,因为这一切都与物理学有关)

因此,您唯一能做的就是在后台线程中加载文件。这将使appp具有响应性(如果您不及时需要数据)。

可以显式地使用BufferedInputStream


可能,可能压缩

正如您所知,在HTTP中,浏览器可能会在其标题中声明它可以压缩数据;然后服务器可以发送HTML的压缩版本。这有助于减少服务器端的负载,并根据需要加快通信速度

同样的人可以自己做

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

Accept-Encoding: gzip
当收到响应头时,幸运的是:

Content-Encoding: gzip
通过包裹溪流,进行单面切割:

outputStream = new GZipOutputStream(outputStream);

inputStream = new GZipImüputStream(inputStream);

节省内存 使相同的字符串实例唯一会减少内存,而且可能会有所帮助,即使这本身会花费大量时间
String.intern()
是个坏主意,因为在Java8之前,字符串会进入永久(不可恢复)内存空间。可以使用

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;
}
private-Map-identityMap=new-HashMap();
公共字符串唯一(字符串s){
如果(s.长度()>=30){
返回s;
}
字符串t=identityMap.get(s);
如果(t==null){
t=s;
识别映射put(s,t);
}
返回t;
}

希望是处理速度更快。

XML的大小是多少?您可以在后台线程中加载该文件吗?您可以先尝试传输数据gzip压缩(GZipInput/OutputStream)。@ChristianKuetbach我添加了一个我正在处理的典型xml文件的示例,但是文件确实被下载了,所以我猜问题是延迟和互联网活动会导致冻结。@JoopEggen你能用一段代码解释一下你的意思吗?谢谢你的回复,在我的情况下,不幸的是我需要实时数据。你知道怎么做吗?
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;
}