加载图像时出现OutOfMemoryError

时间:2015-06-26 18:13:52

标签: xamarin xamarin.forms

我有一个显示图片的简单页面。来源是一个网址

   var img = new Image ();
    var source = new UriImageSource {
        Uri = new Uri (string.Format ("http://xxxx.com/imagem/?{0}", url)),
            CachingEnabled = false
        };
        img .Source = source;

但是当我访问此页面()时,第四次或第五次,我收到此错误

java.lang.OutOfMemoryError
    at android.graphics.Bitmap.nativeCreate(Native Method)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:928)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:901)
    at android.graphics.Bitmap.createBitmap(Bitmap.java:868)
    at md5530bd51e982e6e7b340b73e88efe666e.ButtonDrawable.n_draw(Native Method)
    at 340b73e88efe666e.ButtonDrawable.draw(ButtonDrawable.java:49)
    at android.view.View.draw(View.java:15235)
    at android.view.View.getDisplayList(View.java:14141).....

3 个答案:

答案 0 :(得分:4)

我们遇到了一个非常类似的问题。看起来Xamarin has released some guidance on the issue,但它并不适合Xamarin Forms。基本上,在设置图像源之前,您需要确定是否应按比例缩小,并手动执行。这可能需要自定义渲染器。

看起来像是Xamarin Forms应该为我们做的事情,但有时你必须用我想的好事来承担坏事。

Here是关于Xamarin论坛关于此问题的讨论。

<强>更新 我刚刚注意到你说只有在第4或第5次加载页面后才会发生这种情况。我们在页面上创建了一个解决问题的解决方法。基本上,您必须将图像的Source设置为null,并在页面消失时强制进行垃圾回收。像这样:

protected override void OnDisappearing ()
{
    base.OnDisappearing ();
    img.Source = null;
    GC.Collect ();
}

答案 1 :(得分:1)

我不是Xamarin.Forms专家,但在Xamarin.Android和Xamarin.iOS上,使用该代码或处理图像(及其来源)是一个非常好的行为。这样做的原因是.net GC可能认为对象非常小,所以他不需要立即释放它并保持引用,而底层的本机实例是多MB大。

答案 2 :(得分:0)

手动调整图像大小(通过GIMP或其他图像编辑器)似乎对我有用。正如其他人所提到的,在OnDisappearing中使用垃圾收集器也可能有所帮助。