Android setBackgroundResource 导致内存不足异常 [英] Android setBackgroundResource cause out of memory excepiton

查看:38
本文介绍了Android setBackgroundResource 导致内存不足异常的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在开发一个在 ViewPager 中显示 12 个视图的游戏本应用程序.这是我的自定义 PagerAdapter :

I'm working on a gamebook application that shows 12 views in a ViewPager. This is my custom 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();
    }
}

在某些设备中,当这行代码被调用时,它会随机导致内存不足异常

In some devices it cause an out of memory exceptionr randomly when this line of code is called

relLayImageView.setBackgroundResource(mImages[position]);

但在所有设备中,当我翻页时,我会在 logcat 中看到类似的内容:

But in all devices I see something like this in the logcat when i turn pages:

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

当我在另一个 Activity 中根据用户操作为主布局设置不同的背景资源时,该应用程序也会因相同的问题在某些设备中崩溃.代码如下:

The app also crashes in some devices for the same problem when in another Activity I set different background resource to the main layout based on user action. Here the code:

            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]);

            }
        });

当我在 mainLayout 上调用 setBackgroundResource() 时,它再次运行异常.

It runs excepiton again when I call setBackgroundResource() on mainLayout.

希望您能帮我解决这个问题,提前致谢!

I hope you can help me to solve this, thanks in advance!

推荐答案

我解决了!你所有的提示都很好,但真正的问题是/drawable"文件夹!我将所有图片都放在系统认为的/drawable"通用文件夹中,例如/drawable/mdpi",所以当我在具有 hdpi 或更多分辨率的设备中运行时,图像被调整大小,变得太大导致 OutOfMemoryException!

I solved! All your hints were good but the real problem was the "/drawable" folder! I had all the pictures in "/drawable" generic folder that is considered by the system like "/drawable/mdpi", so when I were running in devices with hdpi or more the images were resized, and became too big which cause OutOfMemoryException!

现在我使用/drawable-nodpi"来存储我的图像.此文件夹的工作方式类似于/drawable",但图像永远不会调整大小!

Now i'm using "/drawable-nodpi" to store my images. This folder works like "/drawable" but the images are never resized!

这篇关于Android setBackgroundResource 导致内存不足异常的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆