У мене в коді є ця 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 ) ) )
воно закликає себе до тих пір, поки не буде виконано якусь умову. Якщо ви вилучите цю умову, цей спосіб ніколи не закінчиться.