2013-12-23 53 views
7

我有一個ActivityTabHost與3其他活動。因此,這些總是存在(或處於「暫停」狀態)。回收位圖不釋放內存

第一個活動有四個不同的圖像(每個〜250kb),他們正在檢索很多內存(大約80MB)。只是指出,我加載屏幕所需的最小尺寸,如果使用layout_weight幫助),所以我想盡量減少所需的內存量。

我已經嘗試在OnPause狀態刪除的圖像,並重新設置他們OnResume,但我沒有運氣,這是什麼,我試圖做一個例子:

imageView.Drawable.Callback = null; 
((BitmapDrawable)imageView.Drawable).Bitmap.Recycle(); 
imageView.Drawable.Dispose(); 
imageView.SetImageDrawable(null); 
imageView.SetImageBitmap(null); 
GC.Collect(); 

我不知道刪除OnPause上的Bitmap是不是最好的策略,但它應該起作用。我不明白爲什麼ImageView不會被GC回收(因爲沒有外部引用)

編輯 這是我如何加載圖像。即使將圖像放在xml文件中也不起作用。另外,我不在乎這個代碼,我只想配置這個位圖。

 void SetBackgroundImages(int imageId, int resId, float width, float height) { 
     var imageView = FindViewById<ImageView>(imageId); 
     using (var bitmap = DecodeSampledBitmapFromResource(Resources, resId, width, height)) 
      imageView.SetImageBitmap(bitmap); 

    } 
    public static Bitmap DecodeSampledBitmapFromResource(Resources res, int resId, float reqWidth, float reqHeight) { 

    var options = new BitmapFactory.Options {InJustDecodeBounds = true}; 
    using (var b = BitmapFactory.DecodeResource(res,resId,options)){} 
     options.InSampleSize = CalculateInSampleSize(options, reqWidth, reqHeight); 
     options.InJustDecodeBounds = false; 
     return BitmapFactory.DecodeResource(res, resId, options); 
    } 
+0

你究竟如何加載你的圖片?簡單地告訴'ImageView'來拉伸或縮放圖像,並不意味着你正在用盡可能小的尺寸加載它。 Afaik,爲了釋放對'Bitmap'的引用,你還需要''無效''ImageView'。 – Cheesebaron

+0

謝謝你的回覆。這不是重點,但我正在將圖片加載爲Xamarin(和Google)文檔點(http://docs.xamarin.com/recipes/android/resources/general/load_large_bitmaps_efficiently/),並獲取樣本。我試圖使ImageView失效(謝謝),但沒有區別,在OnResume中我得到一個OutOfMemmory異常... – Adam

+0

它使用了哪些部分?請提供實際將圖像加載到視圖中的代碼。 – Cheesebaron

回答

7

最後在刪除圖像後調用java.lang.System.gc()做了訣竅。

+1

它實際上是'java.lang.System.gc();' –

1
using (var imageView = FindViewById<ImageView>(Resource.Id.imageView1)) 
    using (var bitmap = Android.Graphics.BitmapFactory.DecodeResource(
      this.Resources, Resource.Drawable.Icon)) 
     imageView.SetImageBitmap(bitmap); 

我看到幾個地方這種做法,另一種是ImageView的使用的WeakReference的。這些方法可以幫助GC正確收集對ImageView的引用

+0

謝謝,這對我有用! –