0

我有 18 张图像在我和应用程序中作为堆栈相互重叠时会创建一朵花。所有图像都添加到 XML 文件中的活动中android:src:'@drawable/blabla..'......但是当我运行我的应用程序时,它返回一个错误java.lang.OutOfMemoryError。请帮助我......我不知道如何解决这个问题。谢谢......

public class PapatyaFaliActivity extends Activity {
     private int[] startLeafID={R.id.imag,R.id.birstart,R.id.ikistart,R.id.ucstart,R.id.dortstart,R.id.besstart,R.id.altistart,R.id.yedistart,
        R.id.sekizstart,R.id.dokuzstart,R.id.onstart,R.id.onbirstart,R.id.onikistart,R.id.onucstart,R.id.ondortstart,R.id.onbesstart,R.id.onaltistart};
    private ImageView[] leafstart=new ImageView[17];
    private int[] leafResouseID={R.drawable.papatya_orta,R.drawable.leaf_1,R.drawable.leaf_2,R.drawable.leaf_3,R.drawable.leaf_4,R.drawable.leaf_5,R.drawable.leaf_6,
        R.drawable.leaf_7,R.drawable.leaf_8,R.drawable.leaf_9,R.drawable.leaf_10,R.drawable.leaf_11,R.drawable.leaf_12,R.drawable.leaf_13,
        R.drawable.leaf_14,R.drawable.leaf_15,R.drawable.leaf_16};

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        for(int i=0;i<17;i++){
            leafstart[i]=(ImageView) findViewById(startLeafID[i]);
        }
        for(int i=0;i<17;i++){
            leafstart[i].setImageResource(leafResouseID[i]);
        }

        Thread timerThread=new Thread(){
            @Override
            public void run() {
                try {
                    sleep(2000);

                } catch (Exception e) {
                    e.printStackTrace();
                }finally{
                    Intent menuIntent=new Intent(getBaseContext(),MenuFrame.class);
                    startActivity(menuIntent);
                }
            }

        };
        timerThread.start();
    }
    @Override
    protected void onPause() {
        super.onPause();
        for(int i=0;i<17;i++){
            leafstart[i].setImageResource((Integer) null);
        }
        finish();
    }
}
4

3 回答 3

1

尝试从代码中读取 18 位图。将位图放在 res/drawable-hdpi 文件夹中。(不同的图像质量有不同的文件夹)。在代码中设置位图字段:

Bitmap alpha;
Bitmap foo;

现在在 onResume() 中初始化位图:

Options options = new Options();
alpha = BitmapFactory.decodeResource(game.getResources(), R.drawable.youBitmapName, options);
foo = BitmapFactory.decodeResource(game.getResources(), R.drawable.youBitmapName2, options);

选项将使您能够下采样。(我不确定您的图像有多大,但您可能还想使用缩放方法)。

在 onPause 中,通过调用清理资源:

alpha.recycle();
alpha = null;
foo.recycle();
foo = null;

一旦调用 onResume() 方法,位图就会重新初始化。

于 2012-07-12T08:27:39.300 回答
1

18 张图片这不是一个大数字。如果你有 OutOfMemoryError 这意味着你的图像太大了。最简单和最好的方法是将这些图像的分辨率调整(降低)到您真正需要的大小。

如果出于某种奇怪的原因您需要高分辨率的图像,那么您应该使用微缩模型以防它们以小比例显示,因此一次只能以全分辨率显示一两个图像。要根据详细信息级别更改可绘制项目,请使用ImageView.setImageLevel(更改详细信息级别)并将资源定义为LevelListDrawable

onPause内调用完成是非常糟糕的主意!

于 2012-07-12T08:23:23.130 回答
0

在创建模拟器时,增加硬件设置下的“VM 应用程序堆大小”和“内存”。这有望解决您的问题。

于 2012-07-12T13:10:49.800 回答