释放GridView中的内存

对于我正在开发的应用程序,我试图用很多图像填充GridView。为避免OutOfMemoryExceptions,我检查可用内存量,并在达到一定阈值时尝试按以下方式释放内存:

private void freeUpMemory() {
    // Clear ImageViews up to current position
    for (int i = 0; i < mCurrentPosition; i++) {
        RelativeLayout gridViewElement = (RelativeLayout) mGridView.getChildAt(i);
        if (gridViewElement != null) {
            ImageView imageView = (ImageView) gridViewElement.findViewById(R.id.image);
            imageView.getDrawable().setCallback(null);
            imageView = null;
        }
    }
}

我注意到这实际上并没有释放内存。我不知道为什么。我想念什么吗?

戴尔·威尔逊(Dale Wilson)

当您的ImageAdapter获得带有convertView不为null的“ getView()”回调时,它告诉您先前由ImageAdapter提供的视图在屏幕上不再可见。这是恢复视图使用的资源的好时机。类似于以下内容:

 ImageView iv = (ImageView)convertView.findViewById(R.id.image_view_in_grid_item);
 iv.setDrawable(null);

应该删除对存储在ImageView中的Drawable的引用。如果您的代码中没有对该Drawable的其他引用,则它应可用于垃圾回收。

更好的是,如果您要显示其他图像。

iv.setDrawable(newImage);

然后,将convertView作为要由网格使用的新视图返回,将用新的Drawable替换旧的Drawable,从而删除引用并可能对图像进行垃圾收集。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章