2013-08-22 2 views
1

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

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, показывает мне, что память накапливается в байт [] с 1,3 МБ. Является ли размер растрового изображения проблемой? Я не знаю, почему память растет.

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

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

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

+0

Его общее приложение, использующее слишком много памяти. Возможно, из загрузки слишком много растровых изображений слишком большого размера. Насколько велики растровые изображения? И вы можете реализовать кэширование, чтобы не сохранять старые растровые изображения и/или явно перерабатывать старые. –

+0

Привет, размер изображений ~ 1,3 МБ. Это большой? Не могли бы вы рассказать мне, как реализовать кеширование? Thx –

+0

1 из них нет, многие из них могут быть. Для кэширования посмотрите на LRUCache, его в библиотеке поддержки. –

ответ

0

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

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

+0

Проблема возникает только на Android 4.2.2. Я пробовал его с переработкой, но не помог. Возможно, это размер изображений? –

+0

@WilhelmDewald В любом случае, вы определенно должны масштабировать растровые изображения. Размер кучи (Java) для процессов приложений довольно ограничен и загрузка 8-мегапиксельной фотографии, например, только для отображения ее в представлении 400x400, является расточительной и медленной. Вы должны прочитать следующую статью: http://developer.android.com/training/displaying-bitmaps/index.html – tiguchi

+0

Хорошо. Может быть, это определенно один вариант. Я посмотрю эту опцию. Спасибо Nobu –