Где я должен вызвать Bitmap.recycle()?
Я разрабатываю приложение для планшета 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()
но где...
1 ответ
Попробуйте это в другом случае, когда ваш convertview не равен нулю:
} else {
imageView = (ImageView) convertView;
Bitmap bm = ((BitmapDrawable) imageView.getDrawable()).getBitmap();
if (bm != null) {
bm.recycle();
}
}
О каком количестве изображений и в каком размере мы говорим? Вы пытались установить адаптер пустым в вашем onStop()? Это может удалить все ссылки и свободную память тоже.