android - 优化 GridLayout 的内存使用

标签 android memory-management out-of-memory android-gridlayout

我正在使用 android-support-v7-gridlayout 在 Android 中模拟基于图 block 的 map .

我在调试期间平稳快速地实现它,直到我在巨大的数据规模上对其进行测试。实际数据约为 ~700x400(行-列),我刚刚在 400x100 中对其进行了测试,但应用程序刚刚崩溃并抛出OutOfMemoryException。然后我减少了数据,直到它实际在 300x100 上运行。它没有滞后或者我没有任何 CPU 性能问题,唯一的问题是 inadequate memory .

这就是我在网格布局中添加 ImageView 的方式:

public boolean genMap(GridLayout gl) {

    gl.removeAllViews();
    gl.setRowCount( mapFile.getRowCount() );
    gl.setColumnCount( mapFile.getColCount() );

    try {

    for (int row = 0; row < mapFile.getRowCount(); ++row) {
        for (int col = 0; col < mapFile.getColCount(); ++col) {

            com.gridlayout.GridLayout.Spec rowspan = GridLayout.spec(row, 1); 
            com.gridlayout.GridLayout.Spec colspan = GridLayout.spec(col, 1);
            GridLayout.LayoutParams lp = new GridLayout.LayoutParams(rowspan, colspan);
            lp.width = Cell.SIZE;
            lp.height = Cell.SIZE;

            Cell cell = genNewCell( ctx.getApplicationContext(), row, col );

            gl.addView( cell, lp );
        }
    }

        return true;

    } catch (Exception e) {
        return false;
    }

}

其中 Cell 是 ImageView 的子类

也许,我也想到了 lazyload 模式,其中唯一可见的 View 将被加载,但是,我想知道 GridLayout 是否已经实现了它。

更新 1

GridView 似乎不是我要找的。它不能沿对角线滚动,而且不能同时具有水平和垂直滚动条。我想要实现的是类似于 GoogleMaps 的 ViewGroup 布局,您可以在其中以二维方式滚动,并且每个单元格 内存分配/解除分配都是自动管理的。我认为 GridLayout 是我最后的希望,因为我看不到任何 ViewGroup w/c 实现了我想要的。

所以我的问题是,我怎样才能回收那些在屏幕上还不可见的单元格,同时保持它们存在时的布局?

最佳答案

GridLayout 不做任何动态内存管理,只是创建所有内容,无论它是否实际在屏幕上。您需要使用类似 GridView 的东西。使用 GridView,理论上您可以支持无限数量的项目。现在因为你想做水平滚动你将需要一个自定义的 GridView 实现。类似于 https://github.com/jess-anders/two-way-gridview .

如果您没有从我的帖子中拿走任何东西,请不要使用网格布局。您可以测试一整天,但每部手机都不同,有些手机的内存或多或少。

编辑 1:

随着 android L 中新 RecyclerView 的发布,这也可能会更容易,但我还没有深入研究它。

关于android - 优化 GridLayout 的内存使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25213984/

相关文章:

java - Libgdx - 使一个实体部分免受物理影响

c - 我创建这个数组时分配的内存在哪里? (C)

php - Composer 更新失败——内存不足

Android,AsyncTask 不调用 onProgressUpdate 和 onPostExecute

java - 更改 Android DatePicker 的字体颜色

C初学者题: Pointer arithmetic > cleaning up once you are done

ios - 由于存储在文档目录中的大量图像,应用程序正在接收内存警告。应用程序崩溃了

在 FileOutputStream 中写入 InputStream 时出现 java.lang.OutOfMemoryError

Android删除tabwidget中标签之间的空格

memory - 什么时候应该避免在 Clojure 中使用 `seq`?