2015-05-09 2 views
1

Я использую viewholde r для загрузки изображений для своих listview. Я загружаю и кеширую изображения с сервера, и вызывается метод интерфейса GetImage для загрузки изображения с локального пути.Утечка памяти из-за загрузки растрового изображения в телезрителе

Проблема заключается в том, что я использую Bitmap b = BitmapFactory.DecodeFile (_coverImgLocation); для загрузки изображения, я получаю исключение памяти после прокрутки в listview. Я знаю, что изображения должны быть загружены с правильным размером, вычисляя выборку. В этом случае это не требуется, потому что изображения с сервера уже имеют тот же размер, что и ImageView s из строк.

, когда я загрузить изображение, как это: Bitmap b = ((BitmapDrawable)_activity.Resources.GetDrawable (Resource.Drawable.splash)).Bitmap; я не получаю исключение памяти, но конечно это неправильный образ ...

Как я получить растровое изображение с пути без утечки памяти?

метод getimage в viewholder:

public void GetImage(string originalImageLocation,string localImageLocation) 
    { 
     if (originalImageLocation == _coverImgLocation) 
     { 
      int screenWidth = _activity.Resources.DisplayMetrics.WidthPixels; 
      int imgWidth = screenWidth - (int)ConvertDpToPix (32f); 
      int imgHeight = (int)(ConvertDpToPix(206f)); 

      BundleProgress.Visibility = ViewStates.Gone; 


      Bitmap b = BitmapFactory.DecodeFile (_coverImgLocation); //memoryexection 

      //Bitmap b = ((BitmapDrawable)_activity.Resources.GetDrawable (Resource.Drawable.splash)).Bitmap;//no memory exception 

      using (b) 
      { 
       CoverIv.SetImageBitmap (b); 
      } 


     } 

    } 
+0

let getImage возвращает ваши 'Bitmap' и' CoverIv.SetImageBitmap (b); 'должен быть вызван непосредственно в' getView() ', но вы не используете свой' int', вы? вы также уверены в размерах рисунка, можете ли вы сказать измерение? 400 * 400? или выше – Elltz

+0

Что вы имеете в виду, что вы не используете свой ints? размер изображений правильный, я на 100% уверен. Я не использую decodefile, но я использую imageloader, который вычисляет выборки и масштабирует изображения с мощностью 2. просто ради этого вопроса я заменил imageloader.getimage() на bitmapfactory.Decodefile – Joske369

ответ

0

Какой метод CoverIv.SetImageBitmap(b) делает? Растровое изображение не будет собирать мусор, пока CoverIv будет ссылаться на него. Поскольку это статический метод, я думаю, что растровое изображение хранится в статическом поле и никогда не будет собираться мусором. У вас все еще есть утечка памяти при удалении CoverIv.SetImageBitmap(b)? Проконсультируйтесь с активными ссылками MAT на ваш растровый рисунок - он покажет вам, почему растровое изображение не собирается.

+0

Действительно у меня нет памяти исключение, когда я удаляю CoverIv.setImageBitmap – Joske369

+0

Как я могу установить изображение, не имея тогда memoryexception? – Joske369

+0

Я попытался установить recyclelistener, чтобы проверить, когда зритель отключается от экрана, с OnMovedToScrapHeap (View v), затем я попытался получить держатель с v.tag и holder.setimagebitmap (null), но он не сработал – Joske369

Смежные вопросы