Недостаточно памяти - исключение при переходе на страницу
Я делаю простое приложение для Windows Phone 8.1 Silverlight. Идея заключается в том, что я могу сделать запись с изображением (сделанным камерой) и добавить к нему текст заголовка и описания. После сохранения записи на главной странице появляется кнопка для ее просмотра. Итак, я сделал 3 записи, и они перечислены на главной странице, но после перехода на их страницы несколько раз, я получаю NavigationFailed вместе с OutOfMemoryException. Страницы просты, они содержат только 1 изображение вместе с некоторыми текстовыми блоками.
Я думал, что проблема в том, что изображения все еще находятся в памяти, поэтому я пытаюсь установить их в ноль и принудительно запустить сборщик мусора, но это не помогло вообще. Что может вызвать исключение OutOfMemory?
protected override void OnNavigatedTo(NavigationEventArgs e)
{
base.OnNavigatedTo(e);
string id= "";
if (NavigationContext.QueryString.TryGetValue("id", out id))
{
foreach (cEntry entry in helper.entries)
{
if (entry.id.ToString() == id)
{
textBlock_viewText.Text = entry.text;
textBlock_viewTitle.Text = entry.title;
using (IsolatedStorageFile userStore = IsolatedStorageFile.GetUserStoreForApplication())
{
if (userStore.FileExists(entry.imageFileName))
{
using (IsolatedStorageFileStream imgStream = userStore.OpenFile(entry.imageFileName, System.IO.FileMode.Open, System.IO.FileAccess.Read))
{
BitmapImage bmp = new BitmapImage();
bmp.SetSource(imgStream);
image_viewEntryImage.Source = bmp;
bmp = null;
}
}
}
}
}
}
}
protected override void OnNavigatedFrom(NavigationEventArgs e)
{
base.OnNavigatedFrom(e);
image_viewEntryImage.Source = null;
GC.Collect();
}
2 ответа
Вместо того, чтобы устанавливать bmp как ноль, попробуйте это.
public static void DisposeImage(BitmapImage image)
{
Uri uri= new Uri("oneXone.png", UriKind.Relative);
StreamResourceInfo sr=Application.GetResourceStream(uri);
try
{
using (Stream stream=sr.Stream)
{
image.DecodePixelWidth=1; //This is essential!
image.SetSource(stream);
}
}
catch { }
}
вызовите этот метод и установите source как этот пользовательский метод после того, как bmp получит значение null. GC не может очистить память. подробности здесь. Почему я получаю исключение OutOfMemoryException, когда у меня есть изображения в моем ListBox?
Возможно, вам придется заморозить BitmapImage.
Как описано здесь, существует проблема с WPF (типичная среда разработки для Windows Phone), когда BitmapImages может быть неправильно поддержан. В то время как это было предположительно исправлено некоторое время назад, люди сообщили, что все еще видели проблему в некоторых случаях.