为什么静态成员会在Xamarin.Forms中失去价值

时间:2018-11-28 08:25:27

标签: xamarin xamarin.forms

我遇到了一个问题,我的应用程序类的静态成员失去了它的价值,而且我不确定我为什么会这样。在我的应用程序构造函数中,我检查用户是否已登录,以及是否未重定向到设置静态应用程序类成员的登录页面。

我了解,如果应用程序被迫关闭以释放资源,这些值将不会保留,因此将启动一个新的应用程序实例并返回登录屏幕。但是,我看到的是静态成员在应用程序会话期间失去了其价值。我可以检查一下简历是否为空,然后重定向到登录页面,但是我不明白为什么会这样。

我的理解是,唯一会丢失值的方法是在后台杀死该应用程序,但此问题表明它也可能在恢复时发生。

2 个答案:

答案 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;
    }
}

根据您的发言,我很欣赏您对静态成员的特殊用法可能不适合该解决方案,但是我所能提供的只是您并不疯狂。这是一个有据可查的怪癖,而不是一个错误(甚至不用费心摇一棵树;我一直与开发人员一起走这条路,并毫不犹豫地被告知该行为将一直存在,并且对于确保整个设备的稳定性)。