Android: растровое изображение в ImageSwitcher вызывает OutOfMemory-Error

Мне нужна ваша помощь. Я пробовал много разных вещей, чтобы найти проблему, но у меня все еще есть проблема с памятью. Вот мой код:

public class AboutActivity extends Activity implements ViewSwitcher.ViewFactory {
//private WebView webview;
static final String BRANDING_PREFS_NAME = "BrandingInfo";

int[] imageIds = {0,1,2,3,4,5 };
int currentImageIndex = 0;
//Runnables
private final Handler handler = new Handler();
private ShowNextImageRunnable showNextImage;
/** Called when the activity is first created. */
/**@Override */
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.about);

    ImageSwitcher imageSwitcher =    (ImageSwitcher)findViewById(R.id.imageSwitcher);
    imageSwitcher.setFactory(this);
    imageSwitcher.setImageResource(R.drawable.about);
    if(brandingInfo.getString("aboutImage0", "").length() > 0 ||
       brandingInfo.getString("aboutImage1", "").length() > 0 ||
       brandingInfo.getString("aboutImage2", "").length() > 0 ||
       brandingInfo.getString("aboutImage3", "").length() > 0 ||
       brandingInfo.getString("aboutImage4", "").length() > 0 ||
       brandingInfo.getString("aboutImage5", "").length() > 0) {
        handler.postDelayed(showNextImage, 0);
    }
}

@Override
public void onPause() {
    super.onPause();
}

@Override
public void onResume() {
    super.onResume();
}

public View makeView() {
      ImageView i = new ImageView(this);
      i.setBackgroundColor(0xFF000000);
      i.setScaleType(ImageView.ScaleType.FIT_START);
      i.setLayoutParams(new ImageSwitcher.LayoutParams(ImageSwitcher.LayoutParams.MATCH_PARENT,
              ImageSwitcher.LayoutParams.MATCH_PARENT));
      i.setAdjustViewBounds(true);
      return i; 
}

private boolean showNextImage(int index){
    BitmapFactory.Options options = new BitmapFactory.Options();
    options.inPurgeable = true;
    options.inInputShareable = true;
    Bitmap bitmap = null;
    try {
        bitmap = BitmapFactory.decodeStream(openFileInput("about"+index+".png"), null, options);
    } catch (FileNotFoundException e) {
        return false;
    }
    ImageSwitcher imageSwitcher = (ImageSwitcher)findViewById(R.id.imageSwitcher);
    final ImageView g = (ImageView) imageSwitcher.getCurrentView();
    final Bitmap b = bitmap;
    runOnUiThread(new Runnable() {
        @Override
        public void run() {
            if (b != null) {
                g.setImageBitmap(b);
            }
        }
    });
    bitmap = null;
    return true;
}

class ShowNextImageRunnable implements Runnable {

      public void run() {
        ++currentImageIndex;
        if(currentImageIndex >= imageIds.length)
            currentImageIndex = 0;

        if(!showNextImage(currentImageIndex))
            handler.postDelayed(showNextImage, 0);
        else
            handler.postDelayed(showNextImage, 3000);
      }

  }

}

Eclipse Memory Analyzer показывает мне, что память накапливается в байтах [] с 1,3 МБ. Является ли размер растрового изображения проблемой? Я не знаю, почему память растет.

Ошибка возникает в функции decodeStream() класса BitmapFactory.

Надеюсь, ты сможешь мне помочь.

Изменить: Размер каждого растрового изображения составляет ~ 1,3 МБ, может быть, это большой. Как я могу реализовать кэширование растровых изображений для моего переключателя изображений. У меня есть 6 изображений, и я загружаю изображение каждые 3 секунды. Я думал о "публичной статической LRU-CACHE"?

1 ответ

Решение

В зависимости от версии Android, на которой вы тестируете, вы можете столкнуться с проблемой, связанной с Bitmap. Фактические данные о пикселях не собираются мусором, поэтому вы должны явно вызвать метод recycle для неиспользуемого объекта Bitmap (это было исправлено в более поздних версиях Android).

Следующая проблема заключается в том, что ваш метод декодирования должен уменьшить растровое изображение до необходимого размера. Ваши изображения могут быть слишком большими.

Другие вопросы по тегам