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