Задать вопрос
@Sailoc
Инженер программист

Как обновить скачанный файл SharedPreference в Android?

Задача такая:
По запросу приложение скачивает с удаленного хранилища файл с настройками SharedPreference AppPrefs.xml. Далее происходит его замена в памяти смартфона. И далее создаю новый экземпляр SharedPreference AppPrefs.xml, но беда в том, что контекст не считывает заново из памяти, а просто достает из контекста старый файл. Из-за этого настройки приложения меняются только после полного перезапуска приложения. Даже метод finish() не помогает, все равно в памяти не меняется экземпляр AppPrefs.xml. Как же быть?

public class AppPreferenceSingleton {

    private static AppPreferenceSingleton mAppPreferenceSingleton = null;
    private static Context mContext = null;
    private static SharedPreferences mAppPref = null;
    private static SharedPreferences.Editor mEditorAppPref = null;

    public static AppPreferenceSingleton getInstance(Context context, boolean update) {
        if (mAppPreferenceSingleton == null || update) {
      
        mAppPref = null;
       mEditorAppPref  = null;     
     
        mContext = context;
       mAppPreferenceSingleton = new AppPreferenceSingleton();
        }
        return mAppPreferenceSingleton;
    }

    private AppPreferenceSingleton() {
        mAppPref = mContext.getSharedPreferences(AppConstants.APP_PREF_NAME, Context.MODE_PRIVATE);
        mEditorAppPref = mAppPref.edit();
    }

    public void createPrefs() {
        mEditorAppPref.putString("create", "ok").commit();
    }


    public void updatePrefs() {
        mEditorAppPref.putString("update", "ok").commit();
    }

    public void setUserName(String userName) {
        mEditorAppPref.putString("userName", userName);
        mEditorAppPref.commit();
    }

    public String getUserName() {
        return mAppPref.getString("userName", "Студент");
    }
}


После того, как скачивание файла AppPrefs.xml завершено, я произвожу обновление:
AppPreferenceSingleton.getInstance(mContext,true);

В дебагер я увидел, что экземпляр mAppPreferenceSingleton создается новый, а mAppPref нет.
  • Вопрос задан
  • 120 просмотров
Подписаться 1 Простой 4 комментария
Пригласить эксперта
Ответы на вопрос 2
akaish
@akaish
Стек Java\Android
Ни разу не приходила в голову мысль заменять xml sp. Вроде как для этого API sp и не писались. Плюсом, с высокой долей вероятности, при закрытии объекта SP в файл записываются данные из буффера SharedPreferences.Editor и не факт, что в то же время.
Зачем вам вообще пытаться использовать этот хак? Храните данные в виде JSON и после скачивания дессериализуйте в POJO c помощью, к примеру, GSON. Ну или используйте Firebase Realtime DB. Или еще пачка стандартных решений. Просто нет гарантии, что даже если Вы сделаете так, что все заработает, работать это будет на всех версиях и устройствах.
А, и да, хороший тон в SP использовать apply(), commit() сразу пишет изменения в файл.
Ответ написан
@Sailoc Автор вопроса
Инженер программист
Единственный возможный вариант, пробовал все, ничего не помогло. Единственный вариант, через костыль.
1. Скачать файлы из удаленного хранилища, назвать их по-другому например добавить к файлу _temp
2. Cоздать временные объекты SharedPreference.
3. Считать все данные из скачанных префов в HashMap.
4. Из HashMap копировать все в рабочий преференс обычным способом через Editor.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы