2012-03-20 3 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自分自身をトリガーするのでループを作成します。ループは実際には再帰であり、あなたが無限に呼び出すと、スタックオーバーフローが発生するまでメモリ(通常のスタックではなく、スタック)をいっぱいにします。

通常の(やや便利)再帰は次のようになります。

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

助けてくれてありがとう!ただ一つの疑問。他の場合と同じように、checkboxpreferenceの変更をコミットする必要はありませんか? (これがばかげているとお詫びしますが、最初に環境設定を使用していました) – skaur

関連する問題