Android,Xamarin:无法通过Singleton写入“应用偏好设置”

时间:2018-08-31 09:00:50

标签: android xamarin

在我们的应用程序中,我们有一个带有应用程序首选项的类,用于存储某些数据。此类的简短版本如下:

public class AppPreferences
{
    private ISharedPreferences mSharedPrefs;
    private ISharedPreferencesEditor mPrefsEditor;
    private Context mContext;

    public AppPreferences(Context context)
    {
        this.mContext = context;
        mSharedPrefs = PreferenceManager.GetDefaultSharedPreferences(mContext);
        mPrefsEditor = mSharedPrefs.Edit();
    }

    public void SaveAutoLogIn(bool autologindone)
    {
        mPrefsEditor.PutBoolean(AUTOLOGIN, autologindone);
        mPrefsEditor.Commit();
    }


    public bool GetSaveAutoLogIn()
    {
       return mSharedPrefs.GetBoolean(AUTOLOGIN, false);
    }


    public void saveLocationPermissionGranted(bool granted)
    {
        mPrefsEditor.PutBoolean(LOCATIONPERMISSION, granted);
        mPrefsEditor.Commit();
    }

    public void savePermissionGranted(bool granted)
    {
        mPrefsEditor.PutBoolean(PERMISSIONS, granted);
        mPrefsEditor.Commit();
    }

}

但我没有继续在需要进行的每个活动中实例化此类,而是决定创建一个单例类(Shorted):

class Preferences : AbstractPreferences<Preferences>
{
    // öffentliche Felder und Methoden
    public string usernameKey { get; set; }
    public string emailKey { get; set;  }
    public int numberOfNews { get; set; }
    public bool locationpermission { get; set; }
    public int numberofnewschats { get; set; }

    AppPreferences ap;
    private Preferences()
    {

    }

    public void GetPreferences(Context mContext)
    {
        ap = new AppPreferences(mContext);

        this.usernameKey = ap.getUsernameKey();
        this.emailKey = ap.getEmailKey()

    }

    public void DeletePreferences()
    {
        ap.deletePreferences();
    }

    public void DeleteTutorialPrefs()
    {
        ap.deleteTutorialPrefs();
    }


    public void SetPreferencesDeviceID(string key)
    {
        ap.saveDeviceID(key);
    }

}

好的,基本上,这个类继承自:

public abstract class AbstractPreferences<T> where T : class
{
    // Lazy Instanziierung
    private static readonly Lazy<T> _instance = new Lazy<T>(() => CreateSingletonInstance());

    public static T Instance
    {
        get
        {
            //  throw new System.InvalidOperationException("out");
            return _instance.Value;
        }
    }

    private static T CreateSingletonInstance()
    {
        // Konstruktion des Singleton-Objekts
        return Activator.CreateInstance(typeof(T), true) as T;
    }
}

}

现在立即实例化所有应用程序首选项,然后将它们设置为一个对象,如:

            Preferences.Preferences prf = Preferences.Preferences.Instance;
    prf.GetPreferences(mContext);

这很麻烦,因为任何其他方式都会导致应用程序首选项崩溃。但这是问题所在:

我无法设置任何偏好。检索它们的效果很好-但是当我设置一个值(如设置为true的bool)时,仅检索该值后,我将获得默认值return(false)。我已尽力调试了。当我在第一堂课(AppPreferences)中时,我看到正确的值被传递到最终函数中:例如:

public void SaveAutoLogIn(bool autologindone)
{
    mPrefsEditor.PutBoolean(AUTOLOGIN, autologindone);
    mPrefsEditor.Commit();
}

但是从函数中获取了一个我从没得到过的值之后,就设置了它。我知道,这是一个复杂的问题-但我确实需要你们的帮助。我希望你能帮帮我!非常感谢!

0 个答案:

没有答案