2013-03-04 52 views
0

我使用的是显示文本和图像的列表视图。我正在尝试使用Task对象异步下载图像并将它们加载到视图中以使ListView高效滚动。但是我经常会遇到OutOfMemoryException异常,因为即使我将它们保存到光盘并访问它,内存中的Bitmap也有太多。我看到的一个原因是,创建了许多任务(对于20个图像,创建了20个任务),并且可能会占用内存。有没有一种有效的方法来做到这一点?Monodroid有效地加载图像

这里是code

回答

1

你必须扩展您的位图,使得他们没有得到他们的全分辨率为加载到内存中。内存中的100kb大小的位图是400kb,因为您需要分配每像素4bytes来保存Alpha,Red,Green和Blue的所有颜色值。如果您使用相机拍摄图像,它们很容易变成10倍大小,并且很快占用大量内存。

我看到你在DecodeSampledBitmap中缩放图像,但是当你不再需要它时,你也需要处理它。

SetBitmap你忘了处置您的位图,你可以简单地把一个using声明它周围:

using(var bitmap = ImageDownloader.DownloadImage(url, width, height)) 
{ 
    if(!token.IsCancellationRequested) 
     (this.m_context as Activity).RunOnUiThread(
       () => imageView.SetImageBitmap(bitmap) 
      ); 
} 

还请看看在Xamarin文档的Load Large Bitmaps Efficiently article

+0

感谢Cheesebaron,我记得之前尝试过,也只是尝试过。我没有看到内存错误,但我也没有看到视图上的图像! – Rohith 2013-03-04 13:34:36

+0

另外,当我试图做Xamarin建议在加载大位图文章bitmap.Recycle,我得到这个错误03-03 22:45:34.159 E/AndroidRuntime(3118):java.lang.RuntimeException:画布:试图使用回收的位图[email protected] 03-03 22:45:34.159 E/AndroidRuntime(3118):\t at android.graphics.Canvas.throwIfRecycled(Canvas.java:1026) 03-03 22:45 :34.159 E/AndroidRuntime(3118):\t在android.graphics.Canvas.drawBitmap(Canvas.java:1127) – Rohith 2013-03-04 13:57:54

0

除了有效地加载位图之外,我最近还发现确保Android知道它可以在以后发布图像也很重要。

其中一个可用的解码选项是InPurgeable,如果您希望Android从内存中清除任何加载的位图,将其设置为true非常重要。

如果设置为true,则生成的位图将分配其像素,以便在系统需要回收内存时清除它们。在这种情况下,当像素需要再次访问(例如位图绘制,的getPixels()被调用),它们将被自动重新解码

参见:

+0

我会尝试这一个,并找出如果我没有看到内存不足的错误。但如果我使用bitmapFactory.DecodeStream,这个选项会有帮助吗? – Rohith 2013-03-06 04:05:12