Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/231.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 加载位图并静态存储它们?_Java_Android_Bitmap_Garbage Collection - Fatal编程技术网

Java 加载位图并静态存储它们?

Java 加载位图并静态存储它们?,java,android,bitmap,garbage-collection,Java,Android,Bitmap,Garbage Collection,我创建了一个小应用程序(一个游戏),可以多次重复使用同一组图像。所以我想我应该创建一个类,负责一次加载所有不同的图像,然后从其他类静态地访问它们。但是,我相信这可能导致垃圾收集器出现问题,这会导致我的应用程序在GC运行时出现延迟。以下是ImgLoader类的外观: public class ImgLoader extends View { public static Bitmap tree1; public ImgLoader(Context context) { super(cont

我创建了一个小应用程序(一个游戏),可以多次重复使用同一组图像。所以我想我应该创建一个类,负责一次加载所有不同的图像,然后从其他类静态地访问它们。但是,我相信这可能导致垃圾收集器出现问题,这会导致我的应用程序在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);
}

}
注意,对于这个问题,我只使用一个位图。基本上,当我想在应用程序中使用图像时,我会说:

object.image = ImgLoader.tree1;
除了这样做之外,还有什么替代方法,它不会占用大量内存


谢谢大家!

尝试以InputStream格式获取它们。。。它们将以字节为单位。。但就个人而言,(而且是真正的个人而言),我更喜欢在需要的时候载入每一张图片,而不是将它们留在记忆中。。对于将来的使用,图像的数量可能会增加,另外,正如你提到的,我在你的代码中注意到的,图像存储在本地(而不是未加载),因此重新加载它们不会有大问题。。但这也是我自己的观点,我不认为这与gc有任何关系;手动调用gc时正在加载图像


我相信是图像的加载导致了你的应用程序延迟。可以异步加载位图

对我来说,这似乎是非常糟糕的做法,尤其是因为您正在加载多个
位图,并保持它们的静态引用

由于即使是很小的
位图
也会消耗相当大的内存,因此很快就会遇到
OutOfMemoryErrors

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


为什么不在需要时从
资源
加载
位图
。应用程序运行正常,但每次GC运行时都会出现延迟。您使用什么来监视垃圾收集?从上面的代码来看,它只是在加载图像时手动触发的。我会这样做,但我需要每次调整它们的大小以使其适合屏幕。我仍然不明白为什么调整位图的大小需要对其进行静态引用?我只是说,所以每次加载它时,我都必须用它调用re size方法。这不是效率低下吗?您是否正在开发一款游戏,需要50 fps?如果没有,就在一台设备上测试一下,我99%肯定它的性能会很好。每次调整它的大小肯定比静态引用位图要好。是的,我正在开发一个游戏。所以不可能有任何滞后。