2015-08-04 5 views
1

Я новичок в разработке приложений, и у меня есть некоторые недостатки. У меня есть метод, который загружает изображение с сервера, а затем превращает его в растровое изображение, поэтому я могу назначить его ImageView. Проблема в том, что если я назову его более чем в 10 раз, приложение завершится сбоем с исключением OutOfMemory. Я попытался удалить старый битмап с Dispose(), но он не работает должным образом. Любой способ исправить это? Код:Xamarin - Как правильно расположить растровые изображения?

/... 
string url = deviceModel.LastPhotoLink; 
Bitmap imageBitmap = await new ImageDownloader().GetImageBitmapFromUrlAsync(url, Activity); 
lastPhoto.SetImageBitmap(imageBitmap); 
imageBitmap.Dispose(); 
/... 

public async Task<Bitmap> GetImageBitmapFromUrlAsync(string url, Context context) { 
    WebClient client = new WebClient(); 
    ISharedPreferences pref = context.GetSharedPreferences("UserSession", FileCreationMode.Private); 
    string cookie = pref.GetString("PHPSESSID", string.Empty); 
    client.Headers.Add(HttpRequestHeader.Cookie, "PHPSESSID=" + cookie); 
    var imageBytes = await Task.Run(() => client.DownloadData(url)); 
    Bitmap imageBitmap = await Task.Run(() => BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length)); 

return imageBitmap; 
} 

ответ

0

Существуют ли какие-либо объекты с ссылками на Bitmaps после вызова Dispose()? Вызов утилиты на объект не гарантирует освобождение всей памяти, вам все равно придется удалять ссылки, чтобы сборщик мусора мог выполнять свою работу.

MSDN article for Bitmap Dispose

соответствующий раздел:

После вызова Dispose, вы должны освободить все ссылки на изображения, так сборщик мусора может вернуть память о том, что изображение было оккупант. Дополнительные сведения см. В разделе Очистка неуправляемых ресурсов и Внедрение метода удаления.

+0

Я не думаю, что есть. – Milen

Смежные вопросы