Android Studio在Viewflipper中给出OutOfMemoryError

时间:2018-10-11 12:26:35

标签: android arrays out-of-memory android-image android-viewflipper

我正在使用ViewFlipper使用数组动态显示图像。图像大约有100张。运行该活动时,该应用程序停止并显示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);
}

2 个答案:

答案 0 :(得分:1)

这些图像中的每个图像都将占用1228800字节的堆空间(640 x 480 x 4字节/像素),比1MB多一点。其中100个将消耗〜120MB的堆空间。您不会在许多Android设备上拥有那么多的堆空间,而ViewFlipper要求您预加载这些图像的全部

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

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

答案 1 :(得分:0)

不要使用viewflipper,请使用android.support.v4中的viewpager。看一下下面的sample如何将viewpager与适配器一起使用。可以在以下博客post中找到更多详细信息。

看看下面的article。 您需要缩放图像并适当处理它们。压缩图像的大小为7 MB。位图占用更多空间。

您也可以尝试使用Picassoglide库来有效处理图像。