java - 避免 Android 多次垃圾收集调用的高效循环

标签 java android for-loop garbage-collection

我有一个 Android 应用程序,允许用户记录数据(例如加速度计、纬度、经度等)。这些字段一共有9个,用户最多可以记录10分钟(每个字段3000条记录)。因此,总共可以收集到 27,000 个数据点。用户还可以拍摄照片和视频上传到 SD 卡。

当用户收集完数据(或 10 分钟结束)时,数据将存储在一个字符串中,随后以 .csv 文件的形式上传到 SD 卡。但问题是,由于大量的垃圾收集(似乎每秒大约收集 5 次左右!),数据附加到字符串需要永远。附加开始很快,但随着数据的增加,速度似乎越来越慢。

这是导致延迟的循环:

           for( i = 0 ; i < len2 ; i++ ) {
                data += accelX[i] + ", " + accelY[i] + ", " + accelZ[i] + 
                ", " + accelT[i] + ", " + latitu[i] + ", " + 
                longit[i] + ", " + orient[i] + ", " + 
                magneX[i] + ", " + magneY[i] + ", " + magneZ[i] + 
                ", " + millis[i] + "\n";

                partialProg = 100.0 * ( (double)(i+1) / (double)(len2));
                dia.setProgress((int) partialProg);

            }

data 只是一个字符串,没有任何内容是 newed,所以我不确定为什么 GC 被如此频繁地调用。我的问题是:这里的问题是什么,和/或我怎样才能使它更有效率?

最佳答案

您正在创建很多对象。每次你使用operator+,你实际上创建了一个新的对象,它是可扩展的[如果你重复很多次]

您可以使用 StringBuilder 来提高效率和 append到它,并在完成后创建字符串。

例如:

sb.append(accelX[i]).append(',').append(accelY[i]).append(',').append(accelZ[i]);

[其中 sb 是 StringBuilder 的一个实例]

关于java - 避免 Android 多次垃圾收集调用的高效循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8744914/

相关文章:

java.util.UnknownFormatConversionException : Conversion = '2'

Android Lollipop 5.0.1 通话时长错误

javascript - 使用条件语句在 Javascript 中的不同 for 循环之间进行选择

matlab - while 循环内有 for 循环

Scala 从 Try 到 Future 的隐式转换

java - 如何使用 Firebase 1.0.2 忽略对象模型的新字段

java - 使用更新的标记删除 map 上的多个标记

java - JavaScript 和 JSF 如何协同工作?

Android Studio 无法完成加载

android - 我应该在已安装的应用程序中与我的免安装应用程序一起实现应用程序链接吗?应用链接的正确实现方式是什么?