2015-06-23 4 views
0

Проект Windows Phone 8. У меня есть класс, который содержит ссылку на изображение. Я инициализирую эту ссылку в обработчике запуска запуска в классе приложения:Статическая переменная, инициализированная в App_Launching внезапно null

private void Application_Launching(object sender, LaunchingEventArgs e) 
{ 
    TheClass.Load(); 
} 

//Elsewhere... 
class TheClass 
{ 
    static private int[] s_Pixels = null; 

    static public void Load() 
    { 
     BitmapImage bi = new BitmapImage(new Uri("/res/image.png", UriKind.Relative)); 
     bi.CreateOptions = BitmapCreateOptions.BackgroundCreation; 
     bi.ImageOpened += OnImageLoaded; 
     bi.ImageFailed += OnImageFailed; 
    } 

    private static void OnImageLoaded(object o, RoutedEventArgs a) 
    { 
     BitmapImage bi = o as BitmapImage; 
     s_Pixels = new WriteableBitmap(bi).Pixels; 
    } 

    // And consumers call this one: 
    static public WriteableBitmap GetImage() 
    { 
     if (s_Pixels == null) 
      SendDebugReport(); 
    } 
} 

Этот код работает для меня. И все же я получаю эти отчеты об отладке, указывая, что s_Pixels имеет значение NULL. Я не могу воспроизвести его, но, очевидно, мои пользователи могут это сделать. Существует путь к коду, который приводит к тому, что GetImage() вызывается без предварительного вызова Load().

Это Load Это не называется, не то, что я звоню Load и OnImageLoaded никогда не бывает.

Других присвоений s_Pixels в других местах нет.

Я проверяю ошибки при загрузке изображений. Есть обработчик событий ImageFailed, который оставляет след журнала. Он никогда не вызывается, и почему бы это - изображение, о котором идет речь, находится в ресурсах приложения.

Как это возможно? Как приложение Windows Phone можно инициализировать и загрузить без запуска запуска?

ответ

2

Application_Launching вызывается только в том случае, если приложение запускается заново. Если вы отправите его на задний план, а система, в конце концов, выметит его, а затем пользователь активирует его, ваши статические данные исчезнут, но Launching будет вызывать не. Вместо этого вы получите звонок до Application_Activated.

Итак, в основном, вам нужно запустить всю статическую инициализацию как на Launching, так и на методах Activated.

Возможно, вы можете воспроизвести проблему, которую ваши пользователи видят, заставляя надгробный памятник вашего приложения с помощью Visual Studio: проверьте «Надгробный камень при деактивации при отладке» на вкладке «Отладка» параметров вашего проекта, запустите приложение под отладчиком, нажмите клавишу Windows, когда приложение запущено, и переключитесь обратно в приложение.

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