SharedPreferences.Editor.apply принудительно закрывает

1

Я использую следующий код:

SharedPreferences.Editor edit = mPrefs.edit();
edit.putString("UUID", UUID.randomUUID().toString());
edit.commit();
//edit.apply();

Это отлично работает, но если я прокомментирую коммит и раскомментирую заявку, сила приложения закрывается на моем устройстве без сообщения об ошибке или брошенного исключения. Как ни странно, это нормально работает в эмуляторе, под 2.2 и 2.3.3. Он закрывается только на моем Nexus с 2.2.1

У меня есть обходное решение выше, но я заинтересован в причине закрытия.

Может ли кто-нибудь помочь?

Приветствия, Венату

  • 2
    Любое принудительное закрытие означает, что у вас есть подробная трассировка стека в вашем журнале. Пожалуйста, опубликуйте это.
Теги:
android-emulator
nexus-one

2 ответа

4
Лучший ответ

apply() был добавлен в уровень API 9 (a.k.a., Android 2.3). Не пытайтесь использовать его на Android 2.2.

  • 0
    Doh! Я не думал, что это будет так просто. Спасибо за ответ
0

Его простой я использую кодекс следующим образом:

if (respondsTo(editor, "apply")) invoke(editor, "apply");
else editor.commit();

а затем у меня есть эти два магических метода как статический импорт.

public static boolean respondsTo(Object object, String methodName) {
    try {
        object.getClass().getMethod(methodName, (Class<?>[]) null);
        return Yes;
    } catch (NoSuchMethodException e) {
        return No;
    }
}

public static Object invoke(Object object, String methodName) {
    try {
        return object.getClass().getMethod(methodName, (Class<?>[]) null).invoke(object);
    } catch (Exception e) {
        return INVOKE_FAILED;
    }
}

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню