优化网格布局的内存使用



我在Android中使用Android -support-v7-gridlayout模拟一个基于tile的地图。

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

这是我在网格布局中添加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的子类

也许,我也想到了懒惰加载模式,其中唯一可见的视图将被加载出来,但是,我想知道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的发布,这也可能更容易,但我还没有研究那么多。

在我看来,你应该使用Webview。已经解决了滚动,缩放,内存问题。

最新更新