对于我正在开发的应用程序,我试图用很多图像填充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;
}
}
}
我注意到这实际上并没有释放内存。我不知道为什么。我想念什么吗?
当您的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] 删除。
我来说两句