Windows Phone 8项目。我有一个包含对图像的引用的类。我在app类的Launching事件处理程序中初始化了所述引用:
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为空。我无法重现它,但我的用户显然可以。有一条代码路径可以在没有事先调用GetImage()
的情况下调用Load()
。
Load
未被调用,而不是我调用Load
而OnImageLoaded
永远不会被调用。
s_Pixels没有其他任何分配。
我检查图像加载错误。有一个ImageFailed
事件处理程序留下日志跟踪。它永远不会被调用,为什么会这样 - 有问题的图像在应用程序的资源中。
怎么可能呢?如果不调用启动,Windows Phone应用程序如何初始化和加载?
答案 0 :(得分:2)
Application_Launching
仅在您的应用程序重新启动时调用。如果您将其发送到后台,并且系统最终将其墓碑化,然后用户重新激活它,您的静态数据将会消失,但Launching
将不被调用。相反,您将接到Application_Activated
的电话。
因此,基本上,您需要在Launching
和Activated
方法上运行所有静态初始化。
您最有可能通过强制使用Visual Studio对应用程序进行逻辑删除来重现用户看到的问题:在项目选项的“调试”选项卡上选中“调试时停用时的墓碑”,在调试器下运行应用程序,按应用程序运行时的Windows键,然后切换回应用程序。