¿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?
- ¿Cuál es la diferencia entre EventBus y RxJava?
- ¿Qué es RxJava equivalente de orElse
- RXJava cómo tratar de conseguir después de x tiempo
- ¿Cómo esperar múltiples llamadas asincrales anidadas usando RxJava-Android?
- Solo observable con varios suscriptores
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.
- Manejar Error de red con Retrofit observable
- Comportamiento de onNext y onComplete
- MVP de Android con RxAndroid + Retrofit
- ¿Cómo puedo manejar excepciones en map () en un Observable en RxJava
- Por qué definir Flowable podría recibir actualizaciones de la base de datos
- RxJava y Retrofit - Aumento de excepciones personalizadas en función de la respuesta del servidor
- ¿Cómo ejecutar 2 consultas secuencialmente en un Android RxJava Observable?
- Combine RxTextView Observable y Retrofit Observable
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 utilizaIntentService
o alguna otra implementación delService
depende de usted, pero desea que unService
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 unWakeLock
(a través de miWakefulIntentService
oWakefulBroadcastReceiver
, o su propioWakeLock
cuidadosamente administrado) y posiblemente unWifiLock
. 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.
- Error del compilador JACK de Android después de la actualización a la última biblioteca de soporte
- Cómo Picasso realmente Cache las imágenes