在Android中加载16KB文件需要35秒?

时间:2012-12-06 03:23:25

标签: java android memory

我的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的内存?

1 个答案:

答案 0 :(得分:2)

我刚刚复制了你的问题,保存了65个整数,并使用你的代码在onResume中再次加载它们。活动3s加载这65个整数!

我做了一些分析,找到了代码丢失时间的地方,发现 Scanner 类是您的主要问题。它似乎使用了一些正则表达式,几乎所有的cpu时间都被用于编译被称为65次的模式。

您应该避免使用scanner类,并找到更好的方法来存储整数值。也许看看http://developer.android.com/reference/java/io/ObjectOutputStream.html