【发布时间】:2015-05-06 22:37:32
【问题描述】:
我的 Android 应用程序中不断运行以下 CountDownTimer。
CountDownTimer timer_status;
timer_status = new CountDownTimer(1000,1000) {
List<Integer> lst = new ArrayList<Integer>();
int k=0;
@Override
public void onTick(long millisUntilFinished) {
String S = "";
k=0;
byte[] writeBuffer = new byte[8];
for (int value : lst) {
if(k==8) {
k=0;
S="";
}
S = S + String.format("%02x ", value).toUpperCase();
writeBuffer[k] = (byte) value;
k++;
}
editSent.setText(S);
}
每个循环,应用程序都会从整数的List 创建一个新的byte[] 缓冲区。
它工作正常,但在 LogCat 上生成 GC_FOR_ALLOC。
03-05 11:12:41.330: D/dalvikvm(21178): GC_FOR_ALLOC freed 511K, 19% free 4662K/5720K, paused 14ms, total 14ms
03-05 11:12:42.250: D/dalvikvm(21178): GC_FOR_ALLOC freed 511K, 19% free 4662K/5720K, paused 15ms, total 15ms
GC_FOR_ALLOC 被触发,因为堆上没有足够的内存来执行分配。可能会在创建新对象时触发。
如何改进这个foreach 循环,在堆上留下足够的内存?
【问题讨论】:
-
当你像这样使用String时,它每次都会创建唯一的String并将它们放入String Pool中。使用 StringBuilder 以获得更好的性能。
-
谢谢。这是开始改进它的好方法。
-
对幻数使用静态final?
标签: java android arrays foreach