我的android应用程序中的java.lang.OutOfMemoryError

时间:2012-07-12 07:58:58

标签: android android-widget out-of-memory

我有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();
    }
}

3 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分: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()方法,位图就会重新初始化。

答案 2 :(得分:0)

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