ImageView:如果ImageView不可见,则自动回收位图(在ScrollView中)

时间:2011-12-01 23:41:25

标签: android memory bitmap imageview scrollview

所以,我已经看了一段时间的ImageView源代码,但我还没想出一个钩子来做这件事。

问题:在ScrollView中有30个400x800图像(图像数量可变)。由于它们完全适合屏幕,因此每个占用1.3 MB的RAM。

我想要的是:能够为ScrollView中当前可见的ImageView加载/卸载位图。如果用户滚动并且位图不再可见(在距离阈值内),则应该回收位图,以便内存可以被同一ScrollView中的其他位图使用。我正在进行下采样以及所有这些,所以不用担心。如果你只通过扩展ImageView来实现这一点(如果可能的话我想不要乱用ScrollView)。

总结:我可以在ImageView变得可见之后加载图片(使用巧妙的技巧),但我不知道何时卸载它们。

注意:由于其他可用性原因,我无法使用ListView执行此操作。

3 个答案:

答案 0 :(得分:5)

如果要回收位图,请调用此方法。

public static void recycleImagesFromView(View view) {
            if(view instanceof ImageView)
            {
                Drawable drawable = ((ImageView)view).getDrawable();
                if(drawable instanceof BitmapDrawable)
                {
                    BitmapDrawable bitmapDrawable = (BitmapDrawable)drawable;
                    bitmapDrawable.getBitmap().recycle();
                }
            }

            if (view instanceof ViewGroup) {
                for (int i = 0; i < ((ViewGroup) view).getChildCount(); i++) {
                    recycleImagesFromView(((ViewGroup) view).getChildAt(i));
                }
            }
        }

答案 1 :(得分:1)

看一下关于"How to draw bitmaps"的android文档,还有一个名为bitmap fun的代码示例。

如果您使用ListView或GridView,ImageView对象将被回收,实际的位图将被释放以供GC清理。

您还希望将原始图像的大小调整为屏幕大小,并将其缓存在磁盘和/或RAM上。这将为您节省大量空间,实际大小应该降低到几百万KB。您还可以尝试以显示器分辨率的一半显示图像。使用少得多的RAM时,结果应该仍然很好。

答案 2 :(得分:0)

你真正想要的是使用ArrayAdapter。如果像你的笔记所说的那样,那是不可能的(虽然我不明白为什么)看看数组适配器的来源并根据自己的需要重写一个。

相关问题