¿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. *.
- El botón de retroceso de Android no funciona
- Restablecer TextView vaya a la parte superior
- Descripción de las pérdidas de memoria en la aplicación de Android
- Múltiples super clases y reutilización de código
- Cómo deshabilitar Android LocationListener cuando se cierra la aplicación
¿Existe consenso sobre cuál es la mejor práctica?
- Builder (android.content.Context) 'no es público en' io.realm.RealmConfiguration.Builder '. No se puede acceder desde el paquete exterior
- Android: Limitar el texto de edición a números
- ¿Cómo un InputStream, InputStreamReader y BufferedReader trabajan juntos en Java?
- Estudio de Android java.lang.NoClassDefFoundError: android.support.v4.app.NavUtilsJB
- ¿Cómo implementar un gesto de deslizamiento entre fragmentos?
- Cómo establecer layout_columnWeight para un niño GridLayout cuando se agrega mediante programación?
- Pestañas en la parte superior e inferior de la pantalla
- Android Spinner - ¿Cómo eliminar los botones de radio?
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.
- Cómo cambiar el nombre del paquete de la aplicación de Android al ensamblar con Gradle?
- ADVERTENCIA: No se especifica ningún destino, se implementa en el emulador