¿Existe una mejor práctica aceptada para realizar solicitudes HTTP asíncronas en Android?

He visto cualquier número de ejemplos y todos parecen resolver este problema de manera diferente. Básicamente, sólo quiero la forma más sencilla de hacer la solicitud que no bloqueará el hilo principal y es cancelable.

También no ayuda que tengamos (al menos) 2 bibliotecas HTTP para elegir, java.net. * (Como HttpURLConnection) y org.apache.http. *.

¿Existe consenso sobre cuál es la mejor práctica?

El SDK de Android 1.5 introdujo una nueva clase, AsyncTask diseñada para hacer que las tareas de ejecución en un hilo de fondo y comunicar un resultado al hilo de interfaz de usuario un poco más simple. Un ejemplo dado en el Blog de desarrolladores de Android da la idea básica de cómo usarlo:

public void onClick(View v) { new DownloadImageTask().execute("http://example.com/image.png"); } private class DownloadImageTask extends AsyncTask { protected Bitmap doInBackground(String... urls) { return loadImageFromNetwork(urls[0]); } protected void onPostExecute(Bitmap result) { mImageView.setImageBitmap(result); } } 

El método doInBackgroundThread se llama en un subproceso independiente (administrado por un conjunto de subprocesos ExecutorService ) y el resultado se comunica al método onPostExecute que se ejecuta en el subproceso de UI. Puede llamar a cancel(boolean mayInterruptIfRunning) en su subclase AsyncTask para cancelar una tarea en ejecución.

En cuanto al uso de las bibliotecas java.net u org.apache.http para el acceso a la red, depende de usted. He encontrado las bibliotecas java.net para ser tranquilo agradable de usar cuando simplemente tratando de emitir un GET y leer el resultado. Las bibliotecas org.apache.http le permitirán hacer casi cualquier cosa que desee con HTTP , pero pueden ser un poco más difíciles de usar y encontré que no funcionan tan bien (en Android) para las solicitudes GET simples.

En realidad hay un par de fallas en el diseño de AsyncTasks que impiden que sea realmente útil para la creación de redes. Un ejemplo fácil es que perderás el vínculo entre tu AsyncTask y tu Actividad … simplemente girando tu dispositivo.

Eche un vistazo a este hilo : usted verá que AsyncTask también muy fácilmente crear fugas de memoria.

La documentación AsyncTask es clara acerca de eso: AsyncTask sólo debe utilizarse para tareas de vida cortas y, obvisouly suficiente, de redes no pertenece a esa categoría.

Así que, realmente sugiero que eche un vistazo a RoboSpice . Esta biblioteca ha sido diseñada para redes asíncronas y es una forma muy robusta de implementarlo. Si sólo tiene unos segundos para estar convencido, mire este inforgraphics .

RoboSpice también como una aplicación de demostración en la tienda: RoboSpice Motivations que explicará todo, en profundidad, sobre redes asíncronas en Android.

¿Qué pasa con un AsyncTask con una referencia a un Fragmento retenido estático (sin una interfaz de usuario) alojado en una actividad u otro fragmento? No hay pérdidas de memoria, operaciones asíncronas elegantes en un hilo separado, sin pérdidas de referencia de objetos.

Creo que esto sería aceptable para la solicitud de http, pero no para las cargas de archivos / descargas. Si lees con cuidado, hay una oración:

Si necesita mantener los subprocesos en ejecución durante largos períodos de tiempo, es altamente recomendable utilizar las diversas API proporcionadas por el pacakge java.util.concurrent como Executor, ThreadPoolExecutor y FutureTask.

Pero no mencionan, que un servicio con un hilo separado podría ser una buena opción también. Esto es para continuar ejecutando las tareas en segundo plano, no importa lo que haga el usuario. (Dg si sube algún archivo que no quiere detener esto porque ha dejado la actividad)

Este enlace para muestras – encuentre el archivo RetainedFragment.java

Este enlace para AsyncTask.

Puede utilizar Async Task para Android. Para hacer la petición http puedes usar la clase HttpURLConnection.

  • No se puede iniciar este animador en una vista separada! Revelar efecto
  • Cajón de navegación: crea una nueva instancia de fragmento cada vez o simplemente "actualiza" los datos.
  • ¿Hay alguna manera de establecer un parámetro de petición base que se incluirá en cada solicitud hecha con la biblioteca de Retrofit de Square?
  • No se puede encontrar el archivo de clase para java.lang.Object
  • ¿Dónde están todos los recursos estándar de iconos de Android?
  • ¿Por qué falla mi prueba de unidad relacionada con JSONObject?
  • Android studio no puede encontrar el símbolo "Actividad"
  • ¿Cómo apoyar la versión androide múltiple en su código?
  • Manera eficiente de manipular los subprocesos RxJava
  • ¿Cómo invocar un método (reflexión) con un parámetro no genérico?
  • ¿Puedo almacenar archivos de imagen en firebase usando la API de Java?
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.