我有一个应用程序,在活动中显示4 ImageViews
。我将所有可能的图像存储在res / drawable文件夹中。图像都是.png,范围从5KB到22KB,都是300x300像素。图像设置为如下方法:
private void displayChoices() {
iv1.setImageResource(mArrayList.get(0)
.getResourceId(this));
iv2.setImageResource(mArrayList.get(1)
.getResourceId(this)); // <--Usually fails on second image.
iv3.setImageResource(mArrayList.get(2)
.getResourceId(this));
iv4.setImageResource(mArrayList.get(3)
.getResourceId(this));
}
在整个会话期间多次调用displayChoices()
方法。到目前为止,我已阅读Displaying Bitmaps Efficiently,但尝试缩小图像的分辨率会使它们变得颗粒状。
mArrayList是对象的ArrayList。在对象类中,我有一个名为getResourceId的方法。
public int getResourceId(Context ctx) {
int mResId;
String packageName = ctx.getPackageName();
String mDrawableName = filename.substring(0, filename.lastIndexOf('.')); //filename is stored in the database and is set when I create the object. it is just a reference to the an .png file in the resource folder.
mResId = ctx.getResources().getIdentifier(mDrawableName , "drawable", packageName);
return mResId;
}
图像以2x2网格显示,均匀分布在屏幕上。
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:baselineAligned="false"
android:orientation="horizontal" >
<FrameLayout
android:id="@+id/choice_1_frame"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:layout_weight="1"
android:padding="5dip" >
<ImageView
android:id="@+id/choice_1_image"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_gravity="center"
android:adjustViewBounds="true"
android:src="@drawable/test_image300x300" />
</FrameLayout>
//repeat frame layout
</LinearLayout>
//Repeat LinearLayout
我尝试在每次调用方法时清除对旧图像的引用,但是在第一次调用时它失败了,所以我现在就丢失了。关于如何阻止OutOfMemory异常发生的任何想法。
答案 0 :(得分:0)
我解决此问题的方法是仅记住图像的资源ID。我写了一个记忆游戏,里面有多张卡片和大量图像。仅在绘制时使用资源ID。为此,我建议使用表面视图并使用onDraw()来显示图像。
onDraw()中的示例:
mBoard [x] [y]包含资源ID并且是游戏板。
bmp = BitmapFactory.decodeResource(mRes, mBoard[x][y]);
canvas.drawBitmap(bmp,null,rf,mPaint);
即使您使用数百张图像,也可以解决内存问题。
希望这会有所帮助 碧玉