我的Nexus One平板电脑上存在Android内存问题,我希望能提供一些见解。
我正在制作一个由64个整数数组表示的棋盘游戏。当Activity的onPause()被调用时,它会保存当前的板,以及每个板从之前的转弯(最多64圈)。这需要大约600毫秒,没问题。当调用onResume()时,是时候加载信息了,完整的撤消历史记录最多可能需要35秒!
FileInputStream fis = c.openFileInput(filename);
Scanner sc = new Scanner(fis);
int nprev = sc.nextInt(); // Number of previous boards to load
sc.nextLine();
for(int k = 0; k < nprev; k++) {
int[] parr = new int[bsize*bsize];
for(int i = 0; i < bsize; i++) {
for(int j = 0; j < bsize; j++) {
int v = sc.nextInt();
parr[i*bsize+j]=v;
}
sc.nextLine();
}
prevBoards.push(parr);
}
sc.close();
fis.close();
}
BSIZE = 8。因此,它只是创建int [64]数组,将数字加载到它们中,然后将它们推送到堆栈(prevBoards)。它最多可以在堆栈上推送64个int [64]数组。不过,我觉得这样做太长了我错了吗?
我注意到,在加载时,LogCat被垃圾邮件发送垃圾邮件,例如“GC_CONCURRENT释放402K,7%免费7500K / 8052K ......”这没有任何意义,因为阵列应该只占用4 * 64 * 64 / 1024 =最多16KB的内存?
答案 0 :(得分:2)
我刚刚复制了你的问题,保存了65个整数,并使用你的代码在onResume中再次加载它们。活动3s加载这65个整数!
我做了一些分析,找到了代码丢失时间的地方,发现 Scanner 类是您的主要问题。它似乎使用了一些正则表达式,几乎所有的cpu时间都被用于编译被称为65次的模式。
您应该避免使用scanner类,并找到更好的方法来存储整数值。也许看看http://developer.android.com/reference/java/io/ObjectOutputStream.html