我的app类的静态成员失去了它的价值我遇到了问题,我不太清楚我理解为什么。在我的app构造函数中,我检查用户是否已登录,如果没有重定向到我设置静态app类成员的登录页面。
我了解如果应用程序被迫关闭以释放资源,这些值不会被保留,因此新的应用程序实例将启动并返回登录屏幕。但是,我所看到的是静态成员在应用程序会话期间失去其价值。我可以检查一下这是否在恢复时为空并重定向到登录页面,但我不明白为什么会发生这种情况。
我的理解是,你失去价值的唯一方法就是如果应用程序在后台被杀,但这个问题会暗示它也可能在恢复时发生。
静态成员不会丢失。如果我们看到代码,那么我们可以进一步协助。另一种方法是,尝试使用单例模式,只有当它的实例为空时才会创建新实例。样品如下:
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; }
}
在普通的C#应用程序中,静态成员通常会永远存在,但不幸的是,您的观察结果完全正确;在Xamarin Forms中,静态成员不能保证在应用程序生命周期内持久存在。
在Android的情况下,如果底层平台指示内存状态较低(或者对多个正在运行的应用程序的内存需求增加),那么静态成员被GC视为可收集,这通常在您暂停应用程序时触发(即切换到其他应用程序) )。它们将减少到默认值,例如。 null,zero等
多年来我一直在努力解决这个问题,而最有效的工作是对这些静态成员实施重新人口模式,例如。
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;
}
}
从你所说的,我很感激你对静态成员的特殊使用可能不适合这个解决方案,但我能提供的只是你不是疯了;这是一个有记录的怪癖,并没有被认为是一个错误(甚至不用打扰那棵树;我和开发者一直走在那条路上,并且毫不含糊地告诉他们这种行为是留下来的,并且是必要的确保整体设备稳定性)。