我正在使用 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/