0

问题

我目前正在通过迭代一组名为“CCTrackLocation”的自定义对象来创建一个 gpx 字符串。但是,这太慢了,尤其是在有很多位置的情况下。我也在异步任务中运行它。

这是我的代码。

for (CCTrackLocation location: trackLocations) {
            //Log.e("CCGPXUtils", "Time wasting");
            String amendedString = gpxString + "<trkpt lat=\""+location.getLatitude()+"\" lon=\""+location.getLongitude()+"\">\n" +
                                                "<ele>"+location.getAltitude()+"</ele>\n" +
                                                "<time>"+CCDateUtility.convertTimestampIntoGPXFormat(location.getTimestamp())+"</time></trkpt>\n";
            gpxString = amendedString;
            amendedString = null;

前 500 个左右的点转换得很好,之后我在调试控制台中得到“GC_FOR_MALLOC”和“GC_CONCURRENT”。

问题

有没有更有效的方法来做到这一点,不会那么耗时?

任何帮助将非常感激。

4

1 回答 1

0

可能是我找到的最简单的解决方案。

由于来自 Objective-C 背景,我不知道“StringBuilder”,但它们是我问题的解决方案。

这是我更新的代码。

StringBuilder stringBuilder = new StringBuilder(gpxString);
        for (CCTrackLocation location: trackLocations) {
            if (isCancelled())
                return null;
            //Log.e("CCGPXUtils", "Time wasting");
            stringBuilder.append("<trkpt lat=\""+location.getLatitude()+"\" lon=\""+location.getLongitude()+"\">\n" +
                                                "<ele>"+location.getAltitude()+"</ele>\n" +
                                                "<time>"+CCDateUtility.convertTimestampIntoGPXFormat(location.getTimestamp())+"</time></trkpt>\n");
}
return stringBuilder.toString();

结果

性能提高了 100 倍。

于 2012-10-05T14:24:54.547 回答