Cortesía de Andrés Nieto Porras (https://www.flickr.com/photos/anieto2k)

Couchbase Lite ejecuta réplicas (sincronizaciones) utilizando subprocesos en segundo plano. El inicio y la detención de las réplicas no se producen de forma sincrónica. Esto puede dar lugar a errores en la detección del estado de una replicación.

En Clase de replicación tiene, según la plataforma, un corriendo o una rutina como isRunning(). Se trata de una forma ligera de comprobar el estado de una replicación.

Sin embargo, su uso puede dar lugar a resultados inesperados. Por ejemplo, hace poco escribí una utilidad que utiliza réplicas continuas. Tengo un botón para iniciarlas y detenerlas. Es tentador usar isRunning para actualizar el estado del botón. Resulta que esto es una mala idea. No es sorprendente, dado que los cambios se producen en segundo plano, pero es fácil pasarlo por alto.

En su lugar, el enfoque preferido utiliza un escuchador de cambios. He aquí un ejemplo.

Tenemos dos clases. La clase de ayuda de base de datos envuelve algunas operaciones estándar para simplificar. He añadido una interfaz para emplear un patrón de devolución de llamada. La clase cliente tiene que implementarlo. La clase helper digiere la notificación de cambio de Couchbase Lite antes de pasar nada al cliente. Esto da una buena separación de preocupaciones.

Las listas de códigos que figuran a continuación son esquemas. Sólo muestran lo esencial. Veamos primero la clase helper.

Vemos que DBHelper implementa el método Replication.ChangeListener interfaz. Se trata de una interfaz definida por Couchbase Lite. En startReplication añadimos este listener a la replicación. Tiene un método para anular, cambiado. En Evento de cambio puede tener varios valores diferentes. En el ejemplo, primero compruebo si hay errores y notifico al usuario si se produce alguno. De lo contrario, compruebo si se trata de un evento de transición de estado de replicación. El estado de destino puede ser uno de los siguientes INICIAL, RUNNING, IDLE, FUERA DE LÍNEA, PARADAo PARADA.

En este caso sólo quiero saber si la replicación se está cerrando, así que simplifico el valor de retorno. Permito a los clientes registrar más de un oyente, así que el último trozo de código hace un bucle sobre todas las retrollamadas y las invoca.

La clase cliente es aún más sencilla. Hago que la clase implemente la interfaz necesaria de la clase helper. Sólo tiene que registrar el oyente durante la construcción de la instancia, y tener onChange haz lo que necesites en la interfaz de usuario.

Este código procede de una herramienta que he creado. Lea sobre la herramienta en esta entradaPuede encontrar el código fuente en GitHub aquí.

Posdata

Consulte más recursos en nuestra portal para desarrolladores y síganos en Twitter @CouchbaseDev.

Puede enviar preguntas a nuestro foros. Y participamos activamente en Stack Overflow.

Contáctame en Twitter @HodGreeley

Autor

Publicado por Hod Greeley, Defensor del Desarrollador, Couchbase

Hod Greeley es desarrollador de Couchbase y vive en Silicon Valley. Tiene más de dos décadas de experiencia como ingeniero de software y director de ingeniería. Ha trabajado en una variedad de campos de software, incluyendo física computacional y química, seguridad informática y de redes, finanzas y móviles. Antes de unirse a Couchbase en 2016, Hod dirigió las relaciones con desarrolladores para móviles en Samsung. Hod es doctor en física química por la Universidad de Columbia.

2 Comentarios

  1. [...] proviene de la clase de ayuda DBService. Escribí un poco sobre la detección del estado de una replicación aquí. Para esta aplicación sólo necesito saber si una replicación se está ejecutando o no para mantener el botón Sync [...]

  2. [...] El otro listener nos permite mostrar un spinner de ocupado-espera (barra de progreso indefinida) dependiendo del estado de Replicación. Puedes leer más sobre la monitorización del estado de replicación aquí. [...]

Dejar una respuesta