【发布时间】:2014-10-02 13:15:26
【问题描述】:
我正在使用 android-support-v7-gridlayout 在 Android 中模拟基于图块的地图。
我在调试期间顺利快速地实现它,直到我在巨大的数据规模上对其进行测试。实际数据约为 ~700x400 (row-column),我刚刚在 400x100 中对其进行了测试,但应用程序刚刚崩溃并抛出OutOfMemoryException。然后我减少了数据,直到它实际运行在 300x100 上。它没有滞后或者我没有任何 CPU 性能问题,唯一的问题是 inadequate memory。
这就是我在网格布局中添加ImageViews 的方式:
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 的子类
也许,我也想到了将加载唯一可见视图的延迟加载模式,但我想知道GridLayout 是否已经实现了它。
更新 1
GridView 似乎不是我想要的。它不能对角滚动,而且不能同时具有水平和垂直滚动条。我想要实现的是类似于 GoogleMaps 的 ViewGroup 布局,您可以在其中以二维方式滚动,并且每个 cells 内存分配/释放都是自动管理的。我认为GridLayout 是我最后的希望,因为我看不到任何 ViewGroup w/c 实现了我想要的。
所以我的问题是,我怎样才能回收那些在屏幕上尚不可见的单元格,同时保持布局不变?
【问题讨论】:
-
屏幕上一次可以看到多少个“单元格”?如果它们很少,那么您可能应该实现一个自定义适配器,它只加载任何给定时间所需的图像。
-
@Code-Apprentice 取决于缩放系数。也许大约 16x8。啊,我虽然它只适用于listview?
-
@Code-Apprentice 有没有办法假装我在 GridLayout 中添加了一些孩子只是为了正确对齐网格内的单元格。因为大部分单元格没有使用?
-
你需要更改你的标题,因为它说你正在使用
GridView。
标签: android memory-management out-of-memory android-gridlayout