我遇到了一个问题,我的应用程序类的静态成员失去了它的价值,而且我不确定我为什么会这样。在我的应用程序构造函数中,我检查用户是否已登录,以及是否未重定向到设置静态应用程序类成员的登录页面。
我了解,如果应用程序被迫关闭以释放资源,这些值将不会保留,因此将启动一个新的应用程序实例并返回登录屏幕。但是,我看到的是静态成员在应用程序会话期间失去了其价值。我可以检查一下简历是否为空,然后重定向到登录页面,但是我不明白为什么会这样。
我的理解是,唯一会丢失值的方法是在后台杀死该应用程序,但此问题表明它也可能在恢复时发生。
答案 0 :(得分:0)
静态成员不会输。如果我们看到代码,那么我们可以提供进一步的帮助。另一种方法是尝试使用单例模式,仅当实例为null时,它才会创建新实例。示例如下:
public sealed class SingletonSample
{
private static SingletonSample instance = null;
private static readonly object padlock = new object();
public static SingletonSample Instance
{
get
{
lock (padlock)
{
if (instance == null)
{
instance = new SingletonSample();
}
return instance;
}
}
}
public string FirstName { get; set; }
}
答案 1 :(得分:0)
在普通的C#应用程序中,静态成员通常会永久存在,但是不幸的是,您的观察是完全正确的;在Xamarin Forms中,不能保证静态成员在应用程序生命周期内一直存在。
在Android的情况下,如果基础平台指示内存不足状态(或多个运行中的应用程序对内存的需求增加),则GC将静态成员视为可收集的,这通常在您暂停应用程序(即切换至一个不同的应用程序)。它们将被还原为默认值,例如。空,零等。
多年来,我一直在努力解决这个问题,而最有效的解决方法是在这些静态成员上实施重新填充模式,例如
internal List<MyCustomType> _AListOfStuff
internal List<MyCustomType> AListOfStuff
{
get
{
if (_AListOfStuff == null)
{
PopulateAListOfStuff(); //If this occurs then the static member has been garbage collected: reload it
}
return _AListOfStuff;
}
}
根据您的发言,我很欣赏您对静态成员的特殊用法可能不适合该解决方案,但是我所能提供的只是您并不疯狂。这是一个有据可查的怪癖,而不是一个错误(甚至不用费心摇一棵树;我一直与开发人员一起走这条路,并毫不犹豫地被告知该行为将一直存在,并且对于确保整个设备的稳定性)。