В моей основной деятельности (с launchmode
, установленным как singleTask
), у меня есть TabHost
с тремя вкладками, каждая из которых содержит пользовательский Gallery
, отображающий Views
, содержащий изображение bitmap
, котороехранится локально (как только мы получим поддержку сервера, они будут загружены вместо этого).
Проблема, с которой я сталкиваюсь, - это ошибка java.lang.OutOfMemoryError: bitmap size exceeds VM budget
(в моем эмуляторе. Она отлично работает на моей Galaxy Tab).Я понимаю, что это означает, что я использую слишком много bitmaps
больших размеров, не перерабатывая их, однако мне трудно определить лучшее место для их переработки, поскольку каждая вкладка остается работающей в фоновом режиме при выборе другой вкладки.
Нужно ли менять адаптер Gallery, чтобы загружать только несколько растровых изображений одновременно (например, выбранный, левый и правый виды), или есть более простое решение (например, хорошее место для вызова recycle()
)?
Редактировать: Я пытался использовать этот код и вызывал его при выборе нового элемента галереи.Сначала это сработало, но потом приложение все равно рухнуло.Я неправильно вызываю recycle ()?
/* *
* Set the current, left, and right view's images. Set all others to NULL and recycle them.
*/
public void refreshImages() {
for (int i = 0; i < adapter.getCount(); i++) {
View v = adapter.getView(i, null, null);
ImageView img = (ImageView) v.findViewById(R.id.add_image);
Thing mything = adapter.getThing(i);//returns a Thing object at this position in the gallery.
if (i == currentGalleryPosition //This is set when the gallery item is selected.
|| i == (currentGalleryPosition - 1)
|| i == (currentGalleryPosition + 1)) {
img.setImageBitmap(thing.getImage(this)); //This retrieves the bitmap from my drawable resources.
img.setScaleType(ImageView.ScaleType.FIT_XY);
}
else {
Bitmap bmp = thing.getImage();
img.setImageBitmap(null);
bmp.recycle();
}
}
}