2012-02-17 8 views
5

Acabo de lanzar mi primer fondo de pantalla en vivo para Android. Lo probé en mi teléfono y en varios teléfonos de mi amigo sin encontrar ningún problema, pero aparentemente en algunos dispositivos se está quedando atrapado en un bucle recursivo y provoca un error de desbordamiento de la pila cuando el usuario intenta cambiar la configuración.onSharedPreferenceChanged está causando un desbordamiento de la pila en algunos dispositivos Android

Creo que el problema se está produciendo porque tengo ciertas configuraciones de "temas" que necesitan cambiar varios otros valores persistentes. Por ejemplo, un tema establecerá un color predeterminado, velocidad, fondo, etc. Parece que cuando persista estos valores programáticamente con Editor.commit(), se está llamando aSharedPreferenceChanged nuevamente, y de nuevo, y nuevamente ...

Dado que este es un fondo de pantalla en vivo, tengo una vista previa que se ejecuta detrás de la pantalla de preferencias transparentes, y necesito que refleje los cambios de configuración a medida que se realizan. También necesito las selecciones de controles deslizantes/selectores de color/lista para reflejar los cambios realizados tanto por el usuario directamente, como programáticamente cuando se selecciona un "tema". La forma más sencilla de hacer esto parecía ser cambiarlos con un editor de preferencias en onSharedPreferenceChanged, y de hecho, esto funciona en muchos dispositivos.

¿Qué puedo hacer para que funcione en todos los dispositivos?

Aquí está el código correspondiente:

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(); 
} 
} 

Respuesta

3

Ok, lo he descubierto. Fue una simple cuestión de anular el registro del oyente antes de llamar a Editor.commit() y luego volver a registrarlo.

+0

¿Podría darnos algún ejemplo? – nAkhmedov

Cuestiones relacionadas