【问题标题】:Where do I have to call Bitmap.recycle()?我必须在哪里调用 Bitmap.recycle()?
【发布时间】:2012-10-16 05:21:49
【问题描述】:

我正在开发一个 Android 3.1 平板电脑应用程序,我有一个带有两个画廊的片段 (android.support.v4.app.Fragment)。

我将此代码用作画廊(我对两个画廊使用相同的适配器):

public class ImageGalleryAdapter extends BaseAdapter
{
    private ArrayList<String> mImagesPath;
    private Context mContext;
    private ImageView.ScaleType mScaleType;
    private int mWidth;
    private int mHeight;

    public ArrayList<String> getmImagesPath()
    {
        return mImagesPath;
    }

    public void setmImagesPath(ArrayList<String> mImagesPath)
    {
        this.mImagesPath = mImagesPath;
    }

    public void addImage(String imagePath)
    {
        mImagesPath.add(imagePath);
    }

    public ImageGalleryAdapter(Context context, ImageView.ScaleType scaleType, int width, int height)
    {
        mContext = context;
        mWidth = width;
        mHeight = height;
        mScaleType = scaleType;

        mImagesPath = new ArrayList<String>();
    }

    @Override
    public int getCount()
    {
        return mImagesPath.size();
    }

    @Override
    public Object getItem(int position)
    {
        return position;
    }

    @Override
    public long getItemId(int position)
    {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent)
    {
        // Get a View to display image data                     
        ImageView imageView;
        if (convertView == null) { // if it's not recycled, initialize some attributes
            imageView = new ImageView(mContext);
            imageView.setScaleType(ImageView.ScaleType.CENTER_CROP);
            imageView.setLayoutParams(new GridView.LayoutParams(
                    LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT));
        } else {
            imageView = (ImageView) convertView;
        }

        File imageFile = new  File(mImagesPath.get(position));
        if(imageFile.exists())
        {
            BitmapFactory.Options options = new Options();
            options.inSampleSize = 32;
            imageView = new ImageView(this.mContext);
            Bitmap myBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath(), options);
            imageView.setImageBitmap(myBitmap);

            imageView.setScaleType(mScaleType);

            // Set the Width & Height of the individual images
            imageView.setLayoutParams(new Gallery.LayoutParams(mWidth, mHeight));
        }

        return imageView;
    }
}

有时,在Bitmap myBitmap = BitmapFactory.decodeFile(imageFile.getAbsolutePath()); 行,我收到内存不足错误

一个画廊有一张图片,另一个画廊有三张图片。

当我转到片段时发生内存不足,点击返回按钮,然后我再次回到片段。

我想我需要打电话给myBitmap.recycle(),但在哪里......

【问题讨论】:

    标签: android bitmap out-of-memory image-gallery


    【解决方案1】:

    当您的 convertview 不为空时,请在 else 情况下尝试:

    } else {
        imageView = (ImageView) convertView;
        Bitmap bm = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
        if (bm != null) {
            bm.recycle();
        }
    }
    

    我们在谈论多少张图片和多大尺寸?您是否尝试在 onStop() 中将适配器设置为空?这也可以删除所有引用并释放内存。

    【讨论】:

    • 04-11 16:49:50.949: E/AndroidRuntime(22992): java.lang.RuntimeException: Canvas: 试图使用回收的位图 android.graphics.Bitmap@426ea1f8
    • 我和 Omid 一样:随机位图似乎在之后使用。我不确定,但我现在在回收之前设置了 imageView.setimageBitmap(null)。让我们看看这是否有效。重新设置后仍然可以给出错误。也许我应该在将 imageView 位图设置为 null 后延迟回收
    猜你喜欢
    • 1970-01-01
    • 2020-08-23
    • 2013-10-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-06
    • 2021-09-29
    • 2016-10-07
    • 2015-05-23
    相关资源
    最近更新 更多