Сохранить загрузку SharedPreferences не работает на Gingerbread. Идеи?
Итак, у меня есть реализация общего класса SharedPreferences, который сериализует некоторый текст и сохраняет его в поле SharedPreferences String. Он отлично работает на моем устройстве HTC One M8 под управлением Android 4.4.2. Однако, когда я тестирую его на своем Samsung Galaxy S1, работающем с рутированным Gingerbread (2.2), он всегда возвращает "ноль" при чтении строки. Есть идеи, что может быть не так?
Если я пытаюсь загрузить сразу после сохранения (в том же процессе), он возвращает строку. Только когда я убиваю процесс и перезапускаю, он исчезает. Примечание: перезапустить с устройства. Не перекомпилировать / повторно развернуть. Weird.
Код:
import android.content.Context;
import android.content.SharedPreferences;
import com.myapp.Container.
/**
*/
public class SharedPrefsSavable {
private final static String PrefsKey = "com.myapp";
public static <T> T load(Class type, Context context) {
SharedPreferences prefs = context.getSharedPreferences(PrefsKey, Context.MODE_PRIVATE);
T userData = null;
try {
String key = getPreferencesId(type);
String stringData = prefs.getString(key, null);
if (stringData != null) {
userData = (T) Container.Serializer.deserialize(type, stringData);
}
}
catch (Exception ex)
{
Container.Log.w("Unable to deserialize " + type + ": " + ex.getMessage());
}
if (userData == null) {
try {
userData = (T) type.newInstance();
}
catch (Exception ex) {
throw new RuntimeException(ex);
}
}
return userData;
}
public void save(Context context) {
SharedPreferences prefs = context.getSharedPreferences(PrefsKey, Context.MODE_PRIVATE);
SharedPreferences.Editor editor = prefs.edit();
String asString = Container.Serializer.serialize(this);
String objectKey = getPreferencesId();
editor.putString(objectKey, asString);
editor.commit();
}
private static String getPreferencesId(Class<? extends SharedPrefsSavable> type) {
return type.getName();
}
public String getPreferencesId() {
return SharedPrefsSavable.getPreferencesId(this.getClass());
}
}
2 ответа
Красная сельдь - это была проблема, характерная для моего устройства, у которого было какое-то поврежденное состояние из-за того, что несколько переустановок не прошли должным образом. Оставьте этот ответ здесь на случай, если другие столкнутся с той же проблемой.
В основном я следил за файлом в
/dbdata/databases/com.myapp/shared_prefs/com.myapp_preferences.xml
Я заметил, что это никогда не менялось. Я удалил приложение и удалил /dbdata/databases/com.myapp
полностью, а затем переустановил. Файлы были воссозданы, и на этот раз это сработало. Поэтому я предполагаю, что из предыдущей установки были устаревшие файлы / папки, которые мое приложение не имело права изменять.
Попробуй это,
SharedPreferences sharedPref = PreferenceManager.getDefaultSharedPreferences( context);
SharedPreferences.Editor editor = sharedPref.edit();
editor.putString( "Key", "value" );
// retrive
SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences( context);
String value = prefs.getString("key","default" );