2015-06-26 12 views
5

Tôi có một trang đơn giản mà sẽ hiển thị một nguồn ảnh được một URLOutOfMemoryError khi tải một hình ảnh

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

nhưng khi tôi truy cập vào trang này(), lần thứ tư hoặc thứ năm nó, tôi có được điều này lỗi

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

Bạn chắc chắn hình ảnh không chỉ bị hỏng? –

Trả lời

4

Chúng tôi gặp sự cố rất giống nhau. Nó xuất hiện Xamarin has released some guidance on the issue, nhưng nó không thực sự hướng tới các hình thức Xamarin. Về cơ bản, trước khi thiết lập nguồn của hình ảnh, bạn cần phải quyết định xem liệu nó có nên được thu nhỏ lại hay không và làm theo cách thủ công. Điều này có thể sẽ yêu cầu Trình kết xuất tùy chỉnh.

Có vẻ như một cái gì đó Xamarin Hình thức nên làm cho chúng ta, nhưng đôi khi bạn phải chấp nhận điều xấu với điều tốt tôi cho là.

Here là cuộc thảo luận trên Diễn đàn Xamarin về vấn đề này.

Cập nhật: Tôi vừa nhận thấy bạn đã nói rằng điều này xảy ra chỉ sau thời gian thứ 4 hoặc thứ 5 trang được tải. Chúng tôi đã tạo một giải pháp thay thế trên trang đã giải quyết được vấn đề. Về cơ bản, bạn phải thiết lập Source của hình ảnh trở lại null và buộc một bộ sưu tập rác khi trang đang biến mất. Như thế này:

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

Tôi không phải là chuyên gia mà Xamarin.Forms nhưng trên Xamarin.Android và Xamarin.iOS nó là một hành vi rất tốt để sử dụng sử dụng xung quanh mã hoặc để xử lý hình ảnh (và nguồn của nó). Lý do cho điều này là .net GC có thể nghĩ rằng đối tượng là rất nhỏ vì vậy anh ta không cần phải giải phóng nó ngay lập tức và giữ giữ một tham chiếu trong khi thể hiện native underlaying là nhiều MB lớn.

0

Thay đổi kích thước hình ảnh theo cách thủ công (thông qua GIMP hoặc một số trình chỉnh sửa hình ảnh khác) có vẻ như đã làm điều đó cho tôi. Như những người khác đã đề cập, sử dụng bộ thu gom rác trong OnDisappearing cũng có thể hữu ích.

Các vấn đề liên quan