tareas sgoliver ejemplo consume asincronas java android http

java - ejemplo - sgoliver rest



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

¿Qué pasa con una AsyncTask con una referencia a un Fragmento retenido estático (sin una IU) alojado en una Actividad u otro fragmento? Sin pérdidas de memoria, elegantes operaciones de sincronización en un hilo separado, sin pérdidas de referencia de objeto.

Creo que esto estaría bien para la solicitud de http, pero no para subir / descargar archivos. Si lees con cuidado, hay una oración:

Si necesita mantener los hilos en ejecución durante largos periodos de tiempo, se recomienda encarecidamente que utilice las diversas API proporcionadas por java.util.concurrent pacakge como Executor, ThreadPoolExecutor y FutureTask.

Pero no mencionan que un service con un subproceso separado también podría ser una buena opción. Esto tiene la intención de continuar ejecutando las tareas en segundo plano, sin importar lo que haga el usuario. (dg si sube un archivo, no quiere detenerlo porque ha abandonado la actividad)

Este link para muestras - encuentre el RetainedFragment.java

Este AsyncTask para AsyncTask.

He visto varios ejemplos y todos parecen resolver este problema de manera diferente. Básicamente, solo quiero la forma más simple de hacer la solicitud que no bloqueará el hilo principal y es cancelable.

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

¿Hay algún consenso sobre cuáles son las mejores prácticas?


De hecho, hay un par de fallas en el diseño de AsyncTasks que evitan que sea realmente utilizable para redes. Un ejemplo fácil es que perderá el vínculo entre su AsyncTask y su Actividad ... simplemente girando su dispositivo.

Echa un vistazo a este hilo : verás que AsyncTask también crea fugas de memoria muy fácilmente.

La documentación de AsyncTask es clara al respecto: AsyncTask solo debe usarse para tareas de vida cortas y, por supuesto, las redes no pertenecen a esa categoría.

Entonces, realmente sugiero que RoboSpice un vistazo a RoboSpice . Esta biblioteca ha sido diseñada para redes asíncronas y es una forma muy robusta de implementarla. Si solo tiene unos segundos para convencerse, mire esta inforgraphics .

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


El SDK de Android 1.5 introdujo una nueva clase, AsyncTask , diseñada para hacer que las tareas en ejecución en una AsyncTask fondo y comunicar un resultado a la cadena de interfaz de usuario sean un poco más simples. Un ejemplo dado en el Blog de Desarrolladores de Android brinda la idea básica sobre 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 doInBackgroundThread en un subproceso independiente (administrado por un subproceso mandado ExecutorService ) y el resultado se comunica al método onPostExecute que se ejecuta en el subproceso de la interfaz de usuario. Puede 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 que las bibliotecas de java.net son tranquilas y agradables de usar cuando simplemente intentan 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 creo que no funcionan tan bien (en Android) para solicitudes GET simples.


Puedes usar Async Task para Android. Para hacer una solicitud http, puede usar la clase HttpURLConnection.