4

我的 Nexus One 平板电脑上的 Android 存在内存问题,我希望能对此有所了解。

我正在制作一个由 64 个整数数组表示的棋盘游戏。当 Activity 的 onPause() 被调用时,它会保存当前的棋盘,以及之前回合的每个棋盘(最多 64 回合)。这大约需要600ms,没问题。当 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 freed 402K, 7% free 7500K/8052K ...”之类的垃圾邮件,这没有意义,因为数组应该只占用 4*64*64/1024=最多16KB内存?

4

1 回答 1

2

我刚刚重现了您保存 65 个整数的问题,并使用您的代码在 onResume 中再次加载它们。加载这 65 个整数需要 3 秒的活动时间!

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

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

于 2013-01-16T11:00:39.940 回答