1

私は Android 3.1 タブレット アプリケーションを開発しており、android.support.v4.app.Fragment2 つのギャラリーを持つ 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());メモリ不足エラーが発生することがあります

1 つのギャラリーには 1 つの画像があり、もう 1 つのギャラリーには 3 つの画像があります。

フラグメントに移動し、[戻る] ボタンをタップしてから、もう一度フラグメントに戻ると、メモリ不足が発生します。

私は電話する必要があると思うmyBitmap.recycle()が、どこに...

4

1 に答える 1

2

convertview が null でない場合は、else ケースでそれを試してください。

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

何枚の画像とどのサイズについて話しているのですか? onStop() でアダプタ null を設定しようとしましたか? これにより、すべての参照と空きメモリも削除される可能性があります。

于 2012-10-16T11:00:44.783 に答える