java - Android加载一个16KB的文件需要35秒?

标签 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 freed 402K, 7% free 7500K/8052K ...”之类的消息,这没有意义,因为数组应该只占用 4*64*64/1024=最多16KB内存?

最佳答案

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

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

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

关于java - Android加载一个16KB的文件需要35秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13736442/

相关文章:

JavaFX 表格 View : Select the whole TableColumn and get the index

java - native 库 bluecove 在 Mac 上不可用

Android 项目作为 Jar 库

memory - Spark : what's the advantages of having multiple executors per node for a Job?

image - RGB 到标准 rgb 转换。矢量化

ios - 链式过滤导致内存崩溃

java - 如何将 Scala 的 List[Double] 转换为 java.util.List[java.lang.Double]?

java - 读取jboss记录器文件(获取绝对路径)

Android studio xml预览未显示并且没有消息

java - BluetoothLeScanner 不扫描;不知道错误是在软件中还是在我的代码中