¿Existe algún patrón de desarrollo que pueda reemplazar un IntentService para las solicitudes de red?

En la aplicación actual que estoy desarrollando con un compañero de trabajo, estamos utilizando IntentServices con llamadas de Volley dentro para procesar las solicitudes de red de RESTful API. Es simplemente datos de cadena JSON simples, y algunas imágenes pequeñas.

Mi pregunta a los que tienen experiencia en el procesamiento de solicitudes de red es la siguiente: ¿hay algo más apropiado o más limpio que implementar?

Por lo que entiendo, la ventaja de usar un IntentService es que se ejecuta en segundo plano fuera del hilo principal, y es típicamente una de las últimas cosas muertas por el sistema operativo Android. La desventaja es que IntentServices se ejecutan secuencialmente.

He estado leyendo mucho sobre RxJava y Retrofit, y siento que nuestras necesidades podrían ser mejor servidas con esa combinación. Retrofit puede ser suficiente por su cuenta, pero me gustaría realmente un poco de visión de terceros.

Mi regla general es:

  • Si la red de E / S debe ser inferior a un segundo, y no le importa si no se ejecuta a la terminación, cualquier opción asíncrona debe estar bien.

  • Si la E / S de red debe ser más de un segundo, o si realmente desea aumentar las probabilidades de que se ejecute a la terminación, utilice un Service . Si usted utiliza IntentService o alguna otra implementación del Service depende de usted, pero desea que un Service sea ​​un indicador para el sistema operativo en el que está trabajando, por lo que no termina su proceso con tanta rapidez una vez que su aplicación se mueve a el fondo. Recuerde que "se mueve al fondo" no siempre es algo iniciado directamente por el usuario, como las llamadas telefónicas entrantes y tal también moverlo al fondo.

  • Si la E / S de la red tardará más de 15 segundos, no sólo necesitará utilizar un Service , sino que necesitará pensar en un WakeLock (a través de mi WakefulIntentService o WakefulBroadcastReceiver , o su propio WakeLock cuidadosamente administrado) y posiblemente un WifiLock . 15 segundos es el período mínimo de auto-pantalla-apagado en Ajustes, de donde viene esa cifra.

Con todo eso en mente:

La desventaja es que IntentServices se ejecutan secuencialmente.

Estoy traduciendo esto como "un IntentService tiene un solo hilo de rosca para procesar peticiones". Esto es verdad. En los casos en que necesite un Service y necesite procesamiento paralelo, cree su propio Service . Sólo asegúrese de llamar a stopSelf() cuando no tiene trabajo pendiente.

He estado leyendo mucho sobre RxJava, y Retrofit, y siento que nuestras necesidades podrían ser mejor servidas con esa combinación

Esto no tiene nada que ver con si utiliza o no un Service . Simplemente no intente hacer cosas asíncronas (por ejemplo, una llamada de Retrofit usando una Callback ) de un IntentService , ya que vence el propósito de IntentService (que indica al sistema operativo en el que está trabajando). Por lo tanto, desde un IntentService , utilizaría la API síncrona de Retrofit, sin una Callback .

Usar IntentServices sólo para realizar una simple solicitud de red, IMO, es mucho. Usted debe utilizar un AsyncTask si usted no quiere utilizar una biblioteca o si usted prefiere ir para el retrofit, el voleo … (yo recomendaría el retrofit). IMO, Servicios o, en este caso, IntentService están diseñados para ejecutar tareas de fondo largas.

La verdadera pregunta es: ¿carga datos para rellenar una Actividad en primer plano o para hacer un trabajo de fondo, incluso cuando no hay interfaz de usuario visible?

Para el trabajo de fondo, un servicio es el camino a seguir. Ni siquiera necesita un IntentService si confía en la gestión de subprocesos de Volley.

Para trabajos en primer plano, considere el uso de Loaders, o Volley o Rxjava llamadas directamente dentro de su Actividad / Fragmento.

  • Obtenga el valor actual de RxJava Observable
  • Prueba de unidad JVM con Mockito para pruebas Retrofit2 y RxJava para solicitudes de red
  • Prueba de unidad de Android con Retrofit / RxJava / Roboletric y Mockito
  • El tipo de retorno observable debe parametrizarse como Observable <Foo> o Observable <? Se extiende Foo>
  • Cómo utilizar CompositeDisposable de RxJava 2?
  • RxJava: ¿Cómo puedo hacer una observación de búsqueda-una vez-y-reutilización?
  • Cómo manejar diferentes tipos de errores en Retrofit Rx onError sin instancia fea
  • Rxandroid pide que se ejecute en el hilo ui aunque esté suscrito en AndroidSchedulers.mainThread ()
  • Encadenamiento de dos llamadas de servicio web mediante RxJava y Retrofit
  • RxJava como autobús de eventos?
  • Dar un RxJava Observable algo a emitir de otro método
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.