Android的setBackgroundResource造成了内存excepiton的(Andro

2019-07-17 16:47发布

我工作的一个gamebook应用程序,显示在ViewPager 12次。 这是我的自定义PagerAdapter:

private class ImagePagerAdapter extends PagerAdapter {

    private int[] mImages = new int[] { R.drawable.copertinai,
            R.drawable.blui, R.drawable.azzurroi, R.drawable.rossoi,
            R.drawable.gialloi, R.drawable.verdei, R.drawable.rosai,
            R.drawable.grigioi, R.drawable.neroi, R.drawable.arancionei,
            R.drawable.marronei, R.drawable.violai, R.drawable.ulm };

    @Override
    public int getCount() {
        return mImages.length;
    }

    @Override
    public boolean isViewFromObject(View view, Object object) {
        return view == ((RelativeLayout) object);
    }

    @Override
    public Object instantiateItem(ViewGroup container, int position) {
        Context context = MainActivity.this;
        RelativeLayout relLayImageView = new RelativeLayout(context);
        relLayImageView.setBackgroundResource(mImages[position]);

        ((ViewPager) container).addView(relLayImageView, new LayoutParams(
                LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        return relLayImageView;
    }

    @Override
    public void destroyItem(ViewGroup container, int position, Object object) {
        ((ViewPager) container).removeView((RelativeLayout) object);
        object=null; 
        System.gc();
    }
}

在一些装置中它导致了存储器exceptionr的随机当这一行的代码被称为

relLayImageView.setBackgroundResource(mImages[position]);

但在所有设备我看到这样的事情在logcat中当我打开网页:

12-31 00:25:31.655: I/dalvikvm-heap(9767): Grow heap (frag case) to 50.875MB for 10384016-byte allocation

该应用程序崩溃也为同样的问题,一些设备当另一个活动我设置不同的背景资源,基于用户行为的主要布局。 这里的代码:

            btn.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {


                colorButtons.get(indiceColoreAttuale).setBackgroundResource(
                                unSelectedColorsRes[indiceColoreAttuale]);

                switch (index) {
                case 0:
                    mainLayout.setBackgroundResource(R.drawable.blus);
                    break;
                case 1:
                    mainLayout
                            .setBackgroundResource(R.drawable.azzurros); 
                    break;
                case 2:
                    mainLayout
                            .setBackgroundResource(R.drawable.rossos);
                    break;
                case 3:
                    mainLayout
                            .setBackgroundResource(R.drawable.giallos);
                    break;
                case 4:
                    mainLayout
                            .setBackgroundResource(R.drawable.verdes);
                    break;
                case 5:
                    mainLayout
                            .setBackgroundResource(R.drawable.rosas);
                    break;
                case 6:                     
                    mainLayout
                            .setBackgroundResource(R.drawable.grigios);
                    break;
                case 7:
                    mainLayout
                            .setBackgroundResource(R.drawable.neros);
                    break;
                case 8:
                    mainLayout
                            .setBackgroundResource(R.drawable.arancios);
                    break;
                case 9:
                    mainLayout
                            .setBackgroundResource(R.drawable.marrones);
                    break;
                case 10:
                    mainLayout
                            .setBackgroundResource(R.drawable.violas);
                    break;
                }

                mainLayout.startAnimation(animationShowTextColor);
                mainLayout.setGravity(Gravity.CENTER_HORIZONTAL);
                indiceColoreAttuale = index;
                colorButtons.get(index).setBackgroundResource(
                        selectedColorsRes[index]);

            }
        });

它excepiton再次运行时,我呼吁mainLayout setBackgroundResource()。

我希望你能帮助我解决这个问题,在此先感谢!

Answer 1:

我解决了! 你的所有暗示都不错,但真正的问题是“/绘制”文件夹! 我把所有的图片在由系统像“/绘制/ MDPI”被认为是“/绘制”通用文件夹,所以当我在与华电国际或多个图像的设备正在运行中调整,并成为太大造成OutOfMemoryException异常!

现在,我使用“/绘制-nodpi”来存储我的图片。 此文件夹就像“/绘制”,但图像是永远不会调整!



Answer 2:

每个Android应用具有可通过Dalvik虚拟机可以使用有限的存储器(堆)。 它是在某些设备上它是64 MB 32 MB。 当你设置的背景资源加载在堆中资源。 该资源加载为位图 - 它的大小是宽*高*像素大小。 Usualy位图加载为具有每像素4个字节ARGB图像。 这意味着,负载1024×768图像花费1024 * 768 * 4 = 3145728 B = 3072 KB上堆= 3 MB。 当加载很多大图像消耗所有可用的堆内存,并导致内存溢出异常。

为了解决这个问题,最好是加载图像小,你可以 - 当你显示图像的缩略图就足以将其加载到这是不是远远大于是显示器的具体部分的分辨率分辨率。 这意味着,当你800x600的显示屏上显示的图像是不足够的装载1024×768的图像。 您可以使用BitmapFactory在较小的分辨率来加载图像。

使用方法decodeResource(activity.getResources(),R.drawable.imageId,选择采用)。 BitmapFactory.Options OPTS具有参数inSampleSize在这里你可以设置图像的欠采样。 此外参数inPreferredConfig可以用来设置RGB_565而不是ARGB_8888的情况下,当你不需要的透明度。



文章来源: Android setBackgroundResource cause out of memory excepiton