我有一个显示图片的简单页面。来源是一个网址
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).....
答案 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中使用垃圾收集器也可能有所帮助。