Android CheckBoxPreference java.lang.StackOverflower错误

Android CheckBoxPreference java.lang.StackOverflower错误,android,Android,我的代码中有这个CheckBoxPreference。我在代码中实现了onSharedPreferenceChanged()以执行一些操作。问题是,当我单击复选框首选项时,函数会在一个具有相同值的循环中被调用。有人能帮我吗 以下是相关的代码片段: 首选项活动中的onSharedPreferenceChanged()部分: if(key.equals(LOCATION_UPDATE_KEY)) { boolean update = sharedPreferences.getBool

我的代码中有这个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>

简单:如果您更改了共享首选项更改中的共享引用,则会创建一个循环,因为您触发了自己。循环实际上是一个递归,如果你无休止地调用你自己,你会填满内存(不是正常的内存-堆栈),直到你得到一个堆栈溢出

正常(有些有用)递归如下所示:

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

在满足某些条件之前,它一直在自命。如果删除该条件,则此方法将永远不会结束。

简单:如果更改共享首选项更改中的SharedReference,则会创建一个循环,因为这是您自己触发的。循环实际上是一个递归,如果你无休止地调用你自己,你会填满内存(不是正常的内存-堆栈),直到你得到一个堆栈溢出

正常(有些有用)递归如下所示:

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

在满足某些条件之前,它一直在自命。如果删除该条件,则此方法将永远不会结束。

我不明白。这是否意味着editor.commit()导致了循环?没错
Editor.commit()
将在更改首选项后再次调用您的
onSharedPreferenceChanged()
。感谢您的帮助!!还有一个疑问。我们不需要像在其他情况下一样将更改提交到checkboxpreference吗?(如果这听起来很傻,我很抱歉,但我是第一次使用首选项)如果调用了
onSharedPreferenceChanged()
,那么可能不会,因为这意味着刚刚存储了一些内容。但我不确定-试试:)如果你在
首选项上设置
android:key
,当用户更改它时,它会自动为你保存。所以你不需要写任何代码,我不明白。这是否意味着editor.commit()导致了循环?没错
Editor.commit()
将在更改首选项后再次调用您的
onSharedPreferenceChanged()
。感谢您的帮助!!还有一个疑问。我们不需要像在其他情况下一样将更改提交到checkboxpreference吗?(如果这听起来很傻,我很抱歉,但我是第一次使用首选项)如果调用了
onSharedPreferenceChanged()
,那么可能不会,因为这意味着刚刚存储了一些内容。但我不确定-试试:)如果你在
首选项上设置
android:key
,当用户更改它时,它会自动为你保存。所以你不需要写任何代码。