Как я могу разрешить несколько галерей битовых карт в tabhost без превышения предела виртуальной машины в Android? - PullRequest
2 голосов
/ 14 октября 2011

В моей основной деятельности (с 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();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 октября 2011

Это не лучшее решение, но оно делает то, что мне нужно:

При декодировании растрового изображения установите для параметров inPurgeable и inInputShareable значение true.Это делает так, что если виртуальной машине требуется больше места, она может просто удалить изображения (очистить), но если вы совместно используете несколько изображений на нескольких вкладках, опция inInputShareable позволяет декодеру просто совместно использовать одно и то же место в памяти, не создаваяновый экземпляр того же растрового изображения.

BitmapFactory.Options o = new BitmapFactory.Options();
o.inDither = true;
o.inPurgeable = true;
o.inInputShareable = true;
return BitmapFactory.decodeResource(getResources(), R.drawable.img, o);
0 голосов
/ 14 октября 2011

возможно System.gc();.Используйте его для вызова сборщика мусора.

Один совет: я бы использовал его, когда кто-то нажимает на вкладку или когда вы передаете, например, 10 изображений.

...