¿Cómo conectarse a una solicitud pendiente con RoboSpice (Splash> Actividad principal)?

Tengo fews preguntas sobre RoboSpice (usos avanzados).

Nota: Uso RoboSpice con OrmLite .

Mi aplicación de Android se compone de dos actividades principales: la primera es SplashActivity (iniciar en el lanzamiento) y la segunda es MainActivity (lanzado 5s después de la pantalla de bienvenida). Realizo 2 peticiones en splash:

SplashActivity

 public class SplashActivity extends BaseActivity { private fooRequest fooRequest; private barRequest barRequest; private exampleRequest exampleRequest; private NewsRequest newsRequest; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ... fooRequest = new fooRequest(); barRequest = new barRequest(); ... new Handler().postDelayed(new Runnable() { @Override public void run() { // Launch MainActivity... } }, 5000); } @Override protected void onStart() { super.onStart(); getSpiceManager().execute(fooRequest, new Integer(0), DurationInMillis.ONE_DAY, new fooRequestListener()); getSpiceManager().execute(barRequest, new Integer(1), DurationInMillis.ONE_DAY, new barRequestListener()); } public final class fooRequestListener implements RequestListener<Foo> { @Override public void onRequestFailure(SpiceException spiceException) { Log.w("MyApp", "RoboSpice - Foo request failure"); } @Override public void onRequestSuccess(final Foo result) { } } public final class barRequestListener implements RequestListener<Bar> { @Override public void onRequestFailure(SpiceException spiceException) { Log.w("MyApp", "RoboSpice - Bar request failure"); } @Override public void onRequestSuccess(final Bar result) { } } } 

El problema

Mi lógica de aplicación no es realmente confiable: no podemos estar seguros de que las solicitudes terminen cuando se inicia MainAcitivty. En la MainActivity consulta mi base de datos con OrmLite para buscar algunos datos y mostrarlos. Así que si la solicitud iniciada en SplashActivity no está terminada, mi vista no mostrará nada.

Preguntas

1) Pienso que necesito agregar un oyente a mis peticiones pendientes (si tal petición existe). En la Wiki de RoboSpice, dijo usar spiceManager.addListenerToPendingRequest . No he logrado apagarlo, a pesar de mis pruebas. Tal vez estoy haciendo algo mal? ¿Puede darme ejemplo de código? Resuelto (ver abajo)

2) Actualmente, el usuario todavía espera 5 segundos (temporizador Splash) antes de llegar a la pantalla de inicio. ¿Cómo comprobar si los datos están en caché? Con spiceManager.getDataFromCache() (se tiene en cuenta la duración de caducidad?).

3) ¿Cuál es la mejor política de reintento para las solicitudes fallidas (a) en la primera puesta en marcha si la base de datos no se crea de nuevo, b) si la base de datos existe pero los datos han caducado)?


Editar

Pregunta # 1 resuelto (cometi un error en mi código original) – # 2 y # 3 sigue siendo relevante. Esto es lo que debe hacer (si puede ayudar a alguien …):

 public class MainActivity extends BaseActivity { private SpiceManager spiceManager = new SpiceManager(CalendarSpiceService.class); ... @Override protected void onStart() { super.onStart(); spiceManager.start(this); spiceManager.addListenerIfPending(Foo.class, new Integer(0), new fooRequestListener()); spiceManager.addListenerIfPending(Bar.class, new Integer(2), new newsRequestListener()); spiceManager.getFromCache(Foo.class, new Integer(0), DurationInMillis.ONE_DAY, new fooRequestListener()); spiceManager.getFromCache(Bar.class, new Integer(2), DurationInMillis.ONE_DAY, new newsRequestListener()); } ... public final class fooRequestListener implements RequestListener<Foo> { @Override public void onRequestFailure(SpiceException spiceException) { Log.w("MyApp", "RoboSpice - Foo request failure"); } @Override public void onRequestSuccess(final Foo result) { String test = result.getResult().iterator().next().getTitle(); Log.w("MyApp", "RoboSpice - Foo request OK ! "+test); } } public final class barRequestListener implements RequestListener<Bar> { @Override public void onRequestFailure(SpiceException spiceException) { Log.w("MyApp", "RoboSpice - Bar request failure"); } @Override public void onRequestSuccess(final Bar result) { Log.w("MyApp", "RoboSpice - Bar request OK ! "+test); } } } 

Pero no entiendo el objetivo de spiceManager.getFromCache aquí …

¡Gracias!

Haría que la pantalla de bienvenida durara más. Parece que hay una verdadera ambigüedad en su propósito: mostrar un logotipo o algo así, o ejecutar peticiones y mostrar un mensaje "please wait".

En el primer caso, estaría bien no ejecutar ninguna solicitud. En el segundo, estaría bien esperar a que regresaran.

Realmente prefiero las aplicaciones que, si necesitan una pantalla de bienvenida, arrancar rápidamente. La pantalla de inicio debe durar menos de 1 segundo. La primera pantalla después de que debe manejar la consulta de datos y por favor espere mensaje.

Pero para responder a sus preguntas:

2) sí, los métodos de caché de SpiceManager utilizan la caducidad de caché de la misma manera que executeRequest. Puede comprobar si hay algo en la memoria caché, pero tendrá que especificar lo que quiere decir "datos válidos" especificando el límite de caducidad de los datos.

3) No veo el enlace con una política de reintento y su problema general. De forma predeterminada, RoboSpice tiene una política de reintento para reintentar 3 veces una solicitud que ha fallado. Si no puede obtener los datos de su caché, significa que no hay nada en ella. Si se invoca el gancho de fallo de su oyente, la solicitud de red falló. Ambos pueden ser el mismo oyente, y su aplicación debe tener un mecanismo general para 1) mostrar que algo está mal, 2) relanzar la solicitud si es necesario después de un tiempo (que podría ser un botón de actualización / menú de artículo).

Espero haber ayudado, pero no tan seguro.

  • ¿Cómo usar Mockito para probar las API a lo largo de Robospice y Retrofit?
  • RoboSpice y ORMLite - Acceso a los datos
  • Robospice en el contexto android.os.Service
  • Primavera Android Vs Retrofit
  • Detener un proceso de fondo en robospice
  • Retrofit / Robospice: ¿Obtener los encabezados de respuesta de una solicitud exitosa?
  • ¿Puedo usar SpiceManager dentro de un servicio?
  • Obtención de datos del caché antes de ejecutar una solicitud de red con RoboSpice
  • Objeto de almacenamiento Robospice que extiende ArrayList en la base de datos a través de Ormlite
  • Uso de RoboSpice y RxJava
  • Qué es la Biblioteca RoboSpice en android
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.