我有一个 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
只是一个字符串,没有任何内容是 new
ed,所以我不确定为什么 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/