Android, Xamarin: невозможно записать настройки приложения через синглтон - PullRequest
0 голосов
/ 31 августа 2018

Я наше приложение, у нас есть класс с настройками приложения, в котором хранятся определенные данные. Короткая версия этого класса выглядит следующим образом:

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

Это было не нужно, поскольку любой другой способ вызывал сбой настроек приложения. Но вот проблема:

Я не могу установить какие-либо префы. Извлечение их работает просто отлично - но когда я устанавливаю значение, например, bool, установленный на true, - после того, как я получаю только это значение, я получаю взамен значение по умолчанию (false). Я отлаживал это, насколько мог. Когда я в первом классе (AppPreferences), я вижу, что правильное значение переносится в конечную функцию: Например:

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

Но после извлечения значения из функции, которую я никогда не получал, было установлено его значение. Я знаю, это сложная проблема, но мне очень нужна помощь ваших парней. Я надеюсь, что вы можете помочь мне! Большое спасибо!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...