la aplicación se bloquea después de cambiar rápidamente las preferencias con commit (

Necesito verificar la entrada del usuario en las preferencias si quieren guardar un nuevo valor. Creo que el código es correcto... porque si voy cambiando los valores lentamente no hay ningún problema. Si cambio demasiado rápido, la aplicación falla.

estoy usando commit() para editar las preferencias. ¿Es este un método demasiado lento?

¿Qué estoy intentando?: si un usuario dio una cadena vacía, le doy un cuadro de diálogo de alerta y cambio la preferencia al valor anterior. Aquí está el código:

public class Preferences extends PreferenceActivity implements OnSharedPreferenceChangeListener {
//save settings
    static String SMStext;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);

            addPreferencesFromResource(R.xml.preferences);

            SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this);

            //-- First get SMStext and save in Strings
            SMStext = sp.getString("SMSText", "0");

            //SharedPreferences.Editor prefEditor = sp.edit();
            sp.registerOnSharedPreferenceChangeListener(this);   

    }


  @Override
  public void onSharedPreferenceChanged(SharedPreferences sp, String key) {

    String smstriggerworderror = "String cannot be empty";

    if (key.equals("SMSText")) {

        if  sp.getString("SMSText", "0").equals(""){

            SharedPreferences.Editor prefEditor = sp.edit();

            prefEditor.putString("SMSText", SMStext);
            prefEditor.commit();
                //write current value back to value and refresh interface
            SMStext = sp.getString("SMSText", "0");
                //Show alert dialog
            showdialog(smstriggerworderror);
            //finish();

        }
        //write current value back to value
        SMStext = sp.getString("SMSText", "0");
    }


private void showdialog(String message) {
      //create alertbox
      AlertDialog.Builder alertbox = new AlertDialog.Builder(this);
      alertbox.setMessage(message);
      alertbox.setNeutralButton("Ok", new DialogInterface.OnClickListener() {
      // Click listener on the neutral button or alert box
          public void onClick(DialogInterface arg0, int arg1) {
              finish();
          }
      });

      // show the alert box
      alertbox.show();      
}

preguntado el 22 de mayo de 12 a las 21:05

Intente publicar el stacktrace, luego sabremos el problema. -

1 Respuestas

Dentro de onSharedPreferenceChanged estas haciendo un prefEditor.commit(); esto entonces llamará al onSharedPreferenceChanged oyente, que luego llamará commit() una y otra vez hasta que............ Error de StackOverFlow.

Solución:

No cambie sus SharedPreferences dentro del oyente OnSharedPreferencesChanged.

contestado el 22 de mayo de 12 a las 22:05

Gracias... Creo que tienes razón... Lo pruebo sin entrar en la instrucción if (key.equals("SMSText"))... No se bloquea. Posiblemente viste que después de ese compromiso () doy un cuadro de diálogo ... al hacer clic en Aceptar hay un final (). Pensé que este paso luego terminó... Bueno, necesito buscar otra solución. El problema que traté de resolver fue que Android guarda primero el nuevo valor de usuario y luego recibe onSharedPreferenceChanged... Sería bueno si pudiera comprobarlo antes de que Android guardara su preferencia compartida... - user1404924

Creo que el problema se encuentra en algún lugar del cuadro de diálogo... Si saco el cuadro de diálogo del código, funciona bien... estamos buscando;) - user1404924

mhhh es el final () !! Bueno, yo lo usé para restablecer todo. Si no lo uso, el usuario no ve ningún valor guardado en la preferencia... pero todavía está allí. Entonces, el valor no se actualiza en la interfaz de usuario. ¿Cómo supero este problema? - user1404924

Creo que lo tengo. El problema principal fue onPause() y onResume() @Override protected void onPause() { super.onPause(); SharedPreferences sp = PreferenceManager.getDefaultSharedPreferences(this); sp.unregisterOnSharedPreferenceChangeListener(esto); } - user1404924

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.