/ / Android CheckBoxPreference java.lang.StackOverflowError - android

Android CheckBoxPreference java.lang.StackOverflowError - андроїд

У мене в коді є ця 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();
}

секція налаштувань уподобань

<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

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

нормальна (дещо корисна) рекурсія виглядає так:

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 ) ) )

воно закликає себе до тих пір, поки не буде виконано якусь умову. Якщо ви вилучите цю умову, цей спосіб ніколи не закінчиться.