¿OnSharedPreferenceChangeListener muere con la instancia de SharedPreference en la que está registrado?

Supongamos que dentro Actividad A Yo tengo un Preferencias compartidas instancia llamada preferencias compartidas y luego invoco al registerOnSharedPreferenceChangeListener(myListener) método en él pasando un OnSharedPreferenceChangeListener objeto llamado miOyente reaccionar a los cambios en las preferencias a las que preferencias compartidas está vinculado.

Mi pregunta es la siguiente: es el onSharedPreferenceChanged método de miOyente invocado incluso si preferencias compartidas se sale del alcance, es decir, se destruye/se recolecta basura, o necesito guardar una referencia al objeto señalado por preferencias compartidas en una Actividad A variable de instancia para estar seguro de que recibiré preferencias cambiadas' eventos durante todo el Actividad A ¿ciclo vital?

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

¿Has intentado provocar esto? ¿Al crear 2 instancias de SharePreference? -

No, lo intentare en cuanto pueda, mientras tanto pregunte por aqui a ver si alguien me da una respuesta a esto quizas más relacionado con java que con android pregunta sobre el alcance del objeto y la vida. -

2 Respuestas

Como la instancia tiene un agente de escucha registrado, los dos objetos no se recolectarán como elementos no utilizados y se llamará al agente de escucha.

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

Ok, entonces tengo otra pregunta. Si quiero cancelar el registro del oyente, ¿cómo puedo hacerlo si no tengo una referencia a preferencias compartidas ¿nunca más? Si funciona como dijiste, no puedo invocar unregisterOnSharedPreferenceChangeListener en otra instancia de Preferencias compartidasdecir preferenciascompartidas2, ¿derecho? Voy a publicar otra pregunta para esto. - Gianni Costanza

Quieres decir que lo que dije es correcto o que puedo invocar dar de baja... en una instancia diferente a Registrarse...? - Gianni Costanza

Creo que las dos insyances de sharedpref son las mismas porque no las creas sino que las obtienes de un contexto... así que puedes registrarte con una referencia y cancelar el registro de otra... - ChristopheCVB

Acabo de probar y funciona como dijiste, ya que getSharedPreferences siempre devuelve lo mismo Preferencias compartidas instancia para un nombre de archivo de preferencia dado. - Gianni Costanza

Creo que dado el hecho de que getSharedPreferences(java.lang.String, int) siempre devuelve lo mismo Preferencias compartidas objeto para una cadena dada (es decir, archivo de preferencias), significa que una referencia a esa instancia debe mantenerse en una variable estática de Preferencias compartidas, por lo que incluso si todas sus referencias quedan fuera del alcance, siempre hay una referencia al Preferencias compartidas instancia de un archivo de preferencias en particular después de haberlo recuperado por primera vez, ¿verdad? - Gianni Costanza

Creo que la respuesta a mi pregunta puede ser: sí, la OnSharedPreferenceChangeListener muere (es decir, ya no se llama) cuando el Preferencias compartidas instancia a la que está conectado es basura recogida, pero eso no pasa tan pronto como la referencia obtenida con getSharedPreferences (o métodos similares) queda fuera del alcance, ya que ese método devuelve un Singleton, es decir, hay una referencia estática al objeto devuelto, almacenada en algún lugar, que mantendrá vivo el objeto. Así que no tienes que preocuparte por almacenar el objeto devuelto por getSharedPreferences (aunque puedes evitar invocar de nuevo getSharedPreferences), ya que esos métodos siempre devuelven una referencia al mismo objeto. Lo único de lo que debe preocuparse es de almacenar una referencia al OnSharedPreferenceChangeListener objetos a los que pasas registrarseOnSharedPreferenceChangeListener para el momento en que necesites darlos de baja en unregisterOnSharedPreferenceChangeListener (aquí tienes que pasar el mismas instancias pasaste al registrarse método, de lo contrario no son no registrado). Gracias a ChristopheCVB que me indicó la dirección correcta.

contestado el 28 de mayo de 12 a las 07:05

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