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

问题描述 投票:0回答:2

我的app类的静态成员失去了它的价值我遇到了问题,我不太清楚我理解为什么。在我的app构造函数中,我检查用户是否已登录,如果没有重定向到我设置静态app类成员的登录页面。

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

我的理解是,你失去价值的唯一方法就是如果应用程序在后台被杀,但这个问题会暗示它也可能在恢复时发生。

xamarin xamarin.forms
2个回答
0
投票

静态成员不会丢失。如果我们看到代码,那么我们可以进一步协助。另一种方法是,尝试使用单例模式,只有当它的实例为空时才会创建新实例。样品如下:

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

}

0
投票

在普通的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;
    }
}

从你所说的,我很感激你对静态成员的特殊使用可能不适合这个解决方案,但我能提供的只是你不是疯了;这是一个有记录的怪癖,并没有被认为是一个错误(甚至不用打扰那棵树;我和开发者一直走在那条路上,并且毫不含糊地告诉他们这种行为是留下来的,并且是必要的确保整体设备稳定性)。

© www.soinside.com 2019 - 2024. All rights reserved.