2012-02-17 5 views
5

私はAndroid版の最初のライブ壁紙をリリースしました。私は携帯電話やいくつかの友人の携帯電話で問題を発見せずにバグをテストしましたが、ユーザーが設定を変更しようとすると、再帰的なループに陥ってスタックオーバーフローエラーが発生するようです。onSharedPreferenceChangedは、一部のAndroid搭載端末でスタックオーバーフローを引き起こしています

私はいくつかの他の永続化された値を変更する必要がある特定の "テーマ"設定があるので、問題が発生していると思います。たとえば、あるテーマではデフォルトの色、スピード、背景などが設定されます。これらの値をEditor.commit()でプログラムで保持すると、onSharedPreferenceChangedをもう一度、もう一度呼び出しているようです...

これはライブ壁紙です、私は透明な設定画面の背後にあるプレビューを持っています、そして、私はそれが作られているように設定の変更を反映する必要があります。私はまた、スライダ/カラーピッカー/リストの設定をユーザが直接変更したり、 "テーマ"を選択したときにプログラムによって変更したものを反映する必要があります。これを行う最も簡単な方法は、onSharedPreferenceChangedの設定エディタでそれらを変更するように思えました。実際、これは多くのデバイスで機能します。

すべてのデバイスで動作させるにはどうすればよいですか?

がここに関連するコードです:

public void onSharedPreferenceChanged(SharedPreferences prefs, String key) 
{ 


    if(key != null) 
    { 

    SharedPreferences.Editor editor = prefs.edit(); 

    hue = prefs.getInt("color", 0); 
    BG_COLOR = prefs.getInt("background_color", 0); 

//etc... 



    if(key.matches("plasma_set")) 
    { 

     plasmaAtlasName = atlasName; 
     editor.putString("atlasName", atlasName); 

     //load each bolt set with defalut values 

     if(plasmaAtlasName.equals("plasmaAtlas11")) 
     { 
      hue = 180; 
      editor.putInt("speed", 10); 
      editor.putInt("bolt_density", 2); 
      BG_COLOR = 0; 
      editor.putInt("background_color", BG_COLOR); 
      editor.putInt("color", hue); 
     } 

     if(plasmaAtlasName.equals("plasmaAtlas9")) 
     { 
      hue = 330; 
      editor.putInt("speed", 10); 
      editor.putInt("bolt_density", 2); 
      BG_COLOR = 0; 
      editor.putInt("background_color", BG_COLOR); 
      editor.putInt("color", hue); 

     } 

    //etc... 
} 

editor.commit(); 
} 
} 

答えて

3

[OK]を、私はそれを考え出しました。 Editor.commit()を呼び出す前にリスナーの登録を解除してから、再度登録してください。

+0

いくつか例を挙げてください。 – nAkhmedov

関連する問題