Android CheckBoxPreference java.lang.StackOverflowError

1

У меня есть этот CheckBoxPreference в моем коде. Я применил onSharedPreferenceChanged() в своем коде для выполнения некоторых действий. Проблема в том, что, когда я нажимаю на настройку флажка, функция вызывается в цикле с одинаковым значением. Кто-нибудь может мне с этим помочь?

Вот соответствующие фрагменты кода:

onSharedPreferenceChanged() в активности предпочтений:

if(key.equals(LOCATION_UPDATE_KEY)) {
        boolean update = sharedPreferences.getBoolean(LOCATION_UPDATE_KEY, false);
        Log.v("preferences", update + "");
        editor.putBoolean(LOCATION_UPDATE_KEY, update);
        editor.commit();
}

раздел интересов xml:

<PreferenceCategory
    android:title="Location">
    <CheckBoxPreference
        android:title="Track Location"
        android:defaultValue="false"
        android:summary="Keep track of handset location (Consumes Battery)"
        android:key="track_option" />
    <ListPreference
        android:title="Location Update Source"
        android:summary=""
        android:key="track_source"
        android:defaultValue="2"
        android:entries="@array/location_sources"
        android:entryValues="@array/location_sources_values"
        android:dependency="track_option" />
    <ListPreference
        android:title="Location Update Interval"
        android:summary=""
        android:key="track_interval"
        android:defaultValue="2"
        android:entries="@array/location_update_interval"
        android:entryValues="@array/location_update_interval_values"
        android:dependency="track_option" />
</PreferenceCategory>
Теги:

1 ответ

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

simple: если вы измените SharedPreference в onSharedPreferenceChanged вы создадите цикл, потому что вы запускаете себя. Цикл на самом деле является рекурсией, и если вы бесконечно называете себя, вы заполняете память (а не обычную - "стек"), пока не получите поток stackoverflow.

нормальная (несколько полезная) рекурсия выглядит так:

public int sumAllNumbersUpTo (int number) {
    if (number > 0) {
        return number + sumAllNumbersUpTo(number - 1);
    } else {
        return 0;
    }
}

int result = sumAllNumbersUpTo(3);
// result is 3 + ( 2 + ( 1 + ( 0 ) ) )

он вызывает себя до тех пор, пока не будет выполнено какое-либо условие. Если вы удалите это условие, этот метод никогда не закончится.

  • 0
    я не понимаю это значит, что editor.commit () вызывает цикл?
  • 0
    Именно так. Editor.commit() снова вызовет ваш onSharedPreferenceChanged() только он изменит предпочтение.
Показать ещё 4 комментария

Ещё вопросы

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