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 に答える