我已经成功编写了一个应用程序,每隔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>
答案 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;
}
希望是,处理变得更快。