android 工作室在 Viewflipper 中出现 OutOfMemoryError

android studio gives OutOfMemoryError in Viewflipper

我正在使用 ViewFlipper 使用数组动态显示图像。图片大约有 100 张。当我 运行 那个 activity 时,应用程序停止并出现 java.lang.OutOfMemoryError: 错误。合并后的图像大小约为 7 MB。为了显示所有图像应该做什么?以下是我正在使用的 java 代码。

ViewFlipper viewflipper;
int result_images[]= 
{R.drawable.resultone,R.drawable.resulttwo,R.drawable.resultthree,
...,R.drawable.resultonehundredsixteen};

viewflipper = (ViewFlipper) findViewById(R.id.viewflipper);
for(int i=0;i<result_images.length;i++)
{
    //  This will create dynamic image view and add them to ViewFlipper
    setFlipperImage(result_images[i]);
}

viewflipper.startFlipping();

private void setFlipperImage(int res) {
    Log.i("Set Filpper Called", res+"");
    ImageView image = new ImageView(getApplicationContext());
    image.setBackgroundResource(res);
    viewflipper.addView(image);
}

不要使用 viewflipper,使用 android.support.v4 中的 viewpager。看看下面的sample how to use viewpager with adapter. More details can be found in the following blog post.

看看下面的article。 您需要缩放图像并适当地处理它们。 7 兆字节是压缩图像的大小。位图消耗更多 space。

您也可以尝试使用 Picasso or glide 库来有效地处理图像。

这些图像中的每一个都将占用 1228800 字节的堆 space (640 x 480 x 4 bytes/pixel),这有点超过 1MB。其中 100 个将消耗 ~120MB 的堆 space。在许多 Android 设备上,您不会有那么多堆 space,并且 ViewFlipper 需要您预加载这些图像的 所有

您将需要改变您的方法,这样您就可以一次只在内存中保存其中的一些图像。至少,这将需要从 ViewFlipper 切换到不需要预加载所有内容的其他内容(例如,使用 AdapterViewFlipper)。

此外,您需要将这些图片放入 res/drawable-anydpi/res/drawable-nodpi/。我的猜测是您将它们放在其他地方(例如,res/drawable/),在这种情况下,它们的内存消耗将在高分辨率设备上显着增加。