studio - volley android implementation
Volley Android-cambios de orientaciĆ³n (3)
Ahora he intentado abordar la preocupación de @ kyle-ivey en el sentido de que las respuestas que llegan entre onPause()
y onResume()
se descartan. Este es un problema real, ya que lo he experimentado en una aplicación en vivo.
Mi enfoque se basa en el patrón de bus de eventos implementado en la respuesta por Thomas Moerman, aunque he reimplantado una aplicación de ejemplo desde cero. Depende de la biblioteca de autobuses Otto Event , Gson y Volley . Se implementa en IntelliJ 13 Ultimate utilizando Maven Tom para resolver las dependencias.
Solución: agrego a las respuestas anteriores una clase que actúa como un búfer de respuesta HTTP que asume la responsabilidad de escuchar eventos mientras la actividad está en transición. Cuando se realiza, la actividad realiza una encuesta activa para detectar cualquier respuesta que pueda haber llegado mientras la actividad estaba desconectada del bus de eventos. Se conecta / desconecta en onPause
y onResume
-eventos al lado del evento-bus registrando de una manera como esta:
@Override
protected void onPause() {
super.onPause();
ServiceLocator.ResponseBuffer.startSaving(); // The buffer takes over
ServiceLocator.EventBus.unregister(this); // Unregistering with Otto
}
@Override
protected void onResume() {
ServiceLocator.EventBus.register(this); // Re-registering
ServiceLocator.ResponseBuffer.stopAndProcess(); // Process any responses buffered
}
Aquí está la implementación de la clase ResponseBuffer .
Advertencia 1 : si la actividad nunca se reanuda, y no se stopAndProcess()
ni a stopAndPurge()
en ninguna actividad futura, el búfer puede ser una fuente de pérdida de memoria. Sé consciente de cómo lo usas. Un patrón seguro sería tener stopAndProcess()
en onResume()
en todas sus actividades.
Advertencia 2 : No es seguro para subprocesos. Si va a producirse un cambio de contexto en la línea entre el lugar donde está guardando las estrellas y anula el registro del bus de eventos, puede recibir el evento dos veces o cero veces.
El ejemplo incluye algunos códigos de prueba en forma de UI y clases de soporte, pero las clases principales que necesitaría si desea utilizar este patrón en proyectos separados son las de los siguientes paquetes:
- nilzor.ottovolley.core
- nilzor.ottovolley.messages
Consulte el repositorio de OttoVolleyDoneRight para ver un ejemplo completo con la interfaz de usuario para la prueba.
¿Cómo podemos lidiar con los cambios de orientación, las Activities
/ los Fragments
detienen / reanudan usando Volley
?
Sé que para las solicitudes GET
, la respuesta se almacenará en la memoria caché y la segunda vez que intentemos hacer esa solicitud, obtendremos una respuesta almacenada en la memoria caché (SI el servidor envía los encabezados HTTP adecuados).
Pero ¿qué pasa con POST
? Supongamos que hago solicitudes POST
(es decir, me registro, lo que quiero que ocurra solo una vez), mi aplicación pasa a segundo plano, la solicitud finaliza mientras la aplicación aún está en segundo plano y luego vuelvo a la aplicación. ¿Cómo obtengo la Response
para esa Request
, o cómo me vuelvo a conectar, si aún está pendiente?
AFAIK no hay apoyo para esto en Volley
. Estoy en lo cierto? ¿Hay una manera fácil de resolver el escenario mencionado anteriormente, usando Volley
?
Hay una solución simple que resolvió mi problema con la descarga de datos de la red utilizando la biblioteca Volley. Si su aplicación utiliza fragmentos debido a las recomendaciones de Google, debe hacer todo lo posible para evitar que se bloquee si el usuario gira la pantalla mientras se cargan los datos setRetainInstance(true);
en el método onCreateView
de su fragmento (-s).
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View theView = inflater.inflate(R.layout.fragment_studios, container, false);
setRetainInstance(true);
lvStudios = (ListView) theView.findViewById(R.id.lvStudios);
return theView;
}
Volley no proporciona un mecanismo para esto fuera de la caja, pero puedes buscar en la biblioteca Otto de Square para Android, está diseñado para manejar situaciones como la tuya con elegancia.
Implemente el Oyente para la solicitud de Volley para que publique una respuesta exitosa en el Bus, envuelto en un objeto de evento como "RegisterEventSuccess" (usted mismo lo define). Permita que sus actividades o fragmentos se suscriban a este tipo de evento con el mecanismo @Subscribe de Otto. Si, por ejemplo, una Actividad lanza la solicitud de Volley y muere debido a un cambio de orientación de la pantalla, otra instancia de Actividad (también registrada en el bus Otto) puede recibir el evento que contiene la respuesta de la solicitud de Volley.
Espero que esto haya sido útil.