加载位图并存储静态替代?

时间:2014-03-01 09:19:30

标签: java android bitmap garbage-collection

我创建了一个小应用程序(游戏),它可以多次重复使用同一组图像。所以我认为我应该创建一个负责加载所有不同图像的类,然后我可以从中静态地从其他类访问它们。但是,我相信这可能会导致垃圾收集器出现问题,导致我的应用程序在运行GC时会滞后。以下是ImgLoader类的内容:

public class ImgLoader extends View {
public static Bitmap tree1;

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

public void loadImgs() {
    System.gc(); // Manually Call GC

    // TREES
    tree1 = BitmapFactory.decodeResource(getResources(), R.drawable.tree);
    tree1 = getResizedBitmap(tree1, MainActivity.height / 2,
            MainActivity.width / 10);
}

public Bitmap getResizedBitmap(Bitmap bm, int newHeight, int newWidth) {
    int width = bm.getWidth();
    int height = bm.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // CREATE A MATRIX FOR THE MANIPULATION
    Matrix matrix = new Matrix();
    // RESIZE THE BIT MAP
    matrix.postScale(scaleWidth, scaleHeight);
    // "RECREATE" THE NEW BITMAP
    Bitmap resizedBitmap = Bitmap.createBitmap(bm, 0, 0, width, height,
            matrix, false);
    return resizedBitmap;
}

public static Bitmap RotateBitmap(Bitmap source, float angle) {
    Matrix matrix = new Matrix();
    matrix.postRotate(angle);
    return Bitmap.createBitmap(source, 0, 0, source.getWidth(),
            source.getHeight(), matrix, true);
}

}

注意,我只使用一个Bitmap来解决问题。基本上,当我想在我的应用程序中使用图像时,我说:

object.image = ImgLoader.tree1;

这样做的替代方法是什么,这不是内存密集型的?

谢谢!

3 个答案:

答案 0 :(得分:2)

这对我来说似乎是非常糟糕的做法,特别是因为您要加载多个Bitmaps 并保留静态引用它们

由于即使很小的Bitmaps会消耗相当多的内存,但很快就会遇到OutOfMemoryErrors

Bitmap 512x512已消耗 1兆字节的RAM(32位)颜色。您可以在RGB_565(16位)中加载位图以减少内存消耗。

为什么不在需要时从Bitmap加载Resources

答案 1 :(得分:0)

尝试以InputStream格式获取它们......它们将是字节...但是人物,(并且它真的是个人)我更喜欢在需要时加载每个图像而不是将它们留在内存中...以备将来使用,图像的数量可以增加,另外,正如你提到的,我在你的代码中注意到,图像存储在本地(而不是负载),所以它很难重新加载它们......但同样是我自己的意见

答案 2 :(得分:0)

不要认为它与gc有任何关系;您手动调用gc时正在加载图像。

我认为这是导致您的应用滞后的图片加载。您可以异步加载位图。