2015-06-26 10 views
5

У меня есть простая страница, которая отображает источник является качественными изображениями URLOutOfMemoryError при загрузке изображений

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. В принципе, перед установкой источника изображения вам нужно решить, следует ли его уменьшать и делать это вручную. Для этого, скорее всего, потребуется Custom Renderer.

Похоже, что что-то для Xamarin Forms должно делать для нас, но иногда вам приходится принимать плохое с хорошим, я полагаю.

Here - обсуждение форумов Xamarin по этой проблеме.

Обновление: Я просто заметил, что вы сказали, что это происходит только после 4 или 5 раз, когда страница загружается. Мы создали обходной путь на странице, которая решила проблему. В принципе, вам нужно вернуть исходный код изображения null и принудительно удалить сборку мусора при исчезновении страницы. Как это:

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

Я не то, что эксперт Xamarin.Forms но Xamarin.Android и Xamarin.iOS это очень хорошее поведение, чтобы использовать используя вокруг этого кода или расположить изображение (и ее источник). Причина этого в том, что GC GC может подумать, что объект очень мал, поэтому ему не нужно немедленно его освобождать и держит ссылку, в то время как базовый экземпляр, лежащий в основе, имеет большое количество МБ.

0

Ручное изменение размера изображения (через GIMP или какой-либо другой редактор изображений), похоже, помогло мне. Как отмечали другие, использование сборщика мусора в OnDisappearing также может помочь.