Xamarin.android 单机器人高效加载图像

Xamarin.android 单机器人高效加载图像,xamarin.android,Xamarin.android,我使用的是显示文本和图像的列表视图。我试图使用Task对象异步下载图像并将其加载到视图中,以使listview高效滚动。但我经常会出现内存异常,因为内存中有太多位图,即使我将它们保存到光盘并访问它。我看到的一个原因是创建了许多任务(对于20个图像,创建了20个任务),并且它可能占用内存。有没有一种有效的方法可以做到这一点 这是一个问题,您必须调整位图的比例,使其不会以完全分辨率加载到内存中。100kb的位图在内存中的大小为400kb,因为您需要为每个像素分配4字节来保存Alpha、红色、绿色和蓝

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


这是一个问题,您必须调整位图的比例,使其不会以完全分辨率加载到内存中。100kb的位图在内存中的大小为400kb,因为您需要为每个像素分配4字节来保存Alpha、红色、绿色和蓝色的所有颜色值。如果你用相机拍摄图像,它们的大小很容易达到10倍,这很快就会占用大量内存

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

在忘记处理位图的情况下,只需在位图周围使用语句放置一个

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

另外,请看一下Xamarin文档中的图片。

除了高效加载位图之外,我最近发现,确保Android知道它可以在以后发布这些图片也很重要

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

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

见:


谢谢Cheesebaron,我记得以前试过这个,也试过。我没有看到内存错误,但我也没有看到视图上的图像!!另外,当我尝试按照Xamarin在加载大型位图文章bitmap.Recycle中的建议执行操作时,我遇到了以下错误03-03 22:45:34.159 E/AndroidRuntime(3118):java.lang.RuntimeException:Canvas:尝试使用回收的位图android.graphics。Bitmap@b393fdf803-03 22:45:34.159 E/AndroidRuntime(3118):在android.graphics.Canvas.throwIfRecycled(Canvas.java:1026)03-03 22:45:34.159 E/AndroidRuntime(3118):在android.graphics.Canvas.drawBitmap(Canvas.java:1127)上,我会试试这个,看看是否没有看到内存不足错误。但是如果我使用的是bitmapFactory.DecodeStream,这个选项会有帮助吗?