加载位图用于静态使用不利于垃圾收集?

时间:2014-02-26 09:42:57

标签: java android bitmap garbage-collection

我创建了一个加载Bitmap图像并将它们存储在静态上下文中的类:

public class ImgLoader extends View {

public static Bitmap tree1;

public ImgLoader(Context context) {
    super(context);
    loadImgs();
}

public void loadImgs() {
    tree1 = BitmapFactory.decodeResource(getResources(), R.drawable.tree);
}
}

然后,我通过这样做访问此图像:

Bitmap tree = ImgLoader.tree1;

有没有其他选择做这样的事情?因为它可能会导致GC出现一些问题。

3 个答案:

答案 0 :(得分:2)

您可以将此方法添加到您的课程

public void recycleBitmap(){
    if(tree1 != null){
        tree1.recycle();
    }
    tree1 = null;
}

答案 1 :(得分:0)

是。以静态方式加载位图对于垃圾收集是不利的。由于位图将保留在内存中,因此它将消耗内存并且不会被垃圾回收。但是好处很少。

这是显示图像的更好方法。如果您多次使用相同的图像,使其静态并重复使用肯定会节省一些内存。此外,如果您想在多个视图上显示图像而不想加载它们,将其设置为静态将对您有所帮助。我们知道,膨胀UI是一项繁重的操作,以便从IO加载位图。因此静态图像很好用,特别是如果需要多个副本。

答案 2 :(得分:0)

您可以使用SoftReference存储对图像的引用。然后,如果你的程序中没有地方使用图像,垃圾收集器可以自由清理它。

如果图像已被垃圾收集,您将需要重新加载图像,否则它将保留在内存中以备重新使用。