2012-03-20 4 views
1

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

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

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

просто: если вы измените 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() вызывает цикл? – skaur

+0

Точно. 'Editor.commit()' снова вызовет ваш 'onSharedPreferenceChanged()' снова, как только он изменит предпочтение. – zapl

+0

спасибо за помощь !! просто еще одно сомнение. dont нам нужно зафиксировать изменения checkboxpreference, как в других случаях? (я прошу прощения, если это звучит глупо, но я впервые использовал настройки) – skaur