Librerías Http & AsyncTask

248 views
Skip to first unread message

Cesar Diez

unread,
Apr 17, 2013, 11:31:11 AM4/17/13
to gdg-ba...@googlegroups.com
Buenas a tod@s!

Seguro que os suena un poco raro que hable de esto ahora, pero desde que descubrí la librería de James Smith (http://loopj.com/android-async-http/)
no he vuelto a utilizar otra cosa para hacer peticiones http (REST + JSON).

Cuando empecé con Android, creabas la típica AsyncTask, y en el doInBackground() creaba el cliente http + configs varias y tira millas. Siempre han ido saliendo implementaciones con mejoras respecto a las anteriores, de como utilizar un AsyncTask correctamente, debido a la abstracción de ésta. Creo que al final, teniendo en cuenta que se guarde una referencia "débil" de la actividad que lo ejecuta y que ésta se ejecute con normalidad y que esté viva, el AsyncTask se acabó convirtiendo a algo parecido a lo siguiente (o eso creo):

static class MyLongTask extends AsyncTask<String, Void, Void> {
        WeakReference<MyActivity> context;
 
        public MyLongTask(MyActivity activity) {
            context = new WeakReference<MyActivity>(activity);
        }
 
        @Override
        protected void onPreExecute() {
            // Avísele al usuario que estamos trabajando
        }
 
        @Override
        protected Void doInBackground(String... params) {
            while(! isCancelled() ){
            // Aquí hacemos una tarea laaarga
            // Y ademas chequeamos que la tarea no ha sido cancelada
 
            }
            return null;
        }
 
        @Override
        protected void onPostExecute(Void result) {
            MyActivity activity = context.get();
            if (activity != null && !activity.isFinishing()) {
                // Aquí actualizamos la UI con el resultado
            }
        }
    } 

Con el paso del tiempo y la aparición de fragments, se empezó a sustituir el típico AsyncTask por fragments que gestionaran las peticiones al web service.

En este artículo se habla de ello, y para mi gusto está muy bien: http://blogactivity.wordpress.com/2011/09/01/proper-use-of-asynctask/

En los proyectos que he hecho hasta ahora, no he planteado una factoría de conexiones que dependiendo de la request a la que se llame, se utilicen métodos que escuchen y se haga algo cuando sea debido.

Por todo esto, quería saber si podíais compartir vuestras experiencias personales sobre el tema. 

Yo, personalmente, tengo mi cliente Rest

public class ExampleRestClient {

private static final String SERVER_RELEASE = "";
private static final String SERVER_TESTING = "";

  private static AsyncHttpClient client = new AsyncHttpClient();

  public static void get(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {

      client.get(getAbsoluteUrl(url), params, responseHandler);

  }

  public static void post(String url, RequestParams params, AsyncHttpResponseHandler responseHandler) {

      client.post(getAbsoluteUrl(url), params, responseHandler);

  }

  private static String getAbsoluteUrl(String relativeUrl) {

      return SERVER_RELEASE + relativeUrl;

  }

}


Y desde la activity:

ExampleRestClient.get(Request.LOGIN, null, new JsonAsyncHttpResponseHandler(Request.LOGIN) {

ProgressDialog progressView;

@Override

public void onStart() {

super.onStart();

progressView = new ProgressDialog(getContext());

progressView.setIndeterminate(true);

progressView.setCancelable(false);

progressView.setMessage("Iniciando sesión");

progressView.show();

}

@Override

public void onSuccess(Object response) {

super.onSuccess(response);

Message m = (Message) response;

if (m.getResult().equals("OK")) {

} else {


}

}

@Override

public void onFailure(Throwable e, Object errorResponse) {

super.onFailure(e, errorResponse);

Toast.makeText(getContext(), e.getMessage(), Toast.LENGTH_SHORT).show();

}

@Override

public void onFailure(Throwable error, String content) {

super.onFailure(error, content);

Toast.makeText(getContext(), "Ha habido un problema de conexión. Vuélva a intentarlo", Toast.LENGTH_SHORT).show();

}

@Override

public void onFinish() {

super.onFinish();

progressView.dismiss();

}

});



Me estoy planteando un cambio para tener el código un poco más modular y escalable... y claro, aunque es bueno no reiventar la rueda, no podemos olvidar los orígenes.

Me recomendáis alguna implementación determinada?


Bernat

unread,
Apr 17, 2013, 1:24:59 PM4/17/13
to gdg-ba...@googlegroups.com

T'ho dic desde el telefon molt rapidament, a casa amplio!

El que et recomano es seguir el exemple google, es a dir:

Activity:
... Loader -> Content Provider -> BBDD
... Servei -> Dades -> toBBBD

D'aquesta manera, el servei actualitza les dades, i al fer els inserts al CP, ell mateix actualitza les dades amb el cursor :)

--
Hazte miembro en la web del GDG ( http://goo.gl/ngNRi ), y para no perderte nada sigue al GDG Barcelona en Google+ ( http://goo.gl/f3xo4 ), Twitter ( twitter.com/GDGBarcelona ), y su blog ( http://gdgbarcelona.blogspot.com.es/ )
---
Has recibido este mensaje porque estás suscrito al grupo "GDG Barcelona" de Grupos de Google.
Para anular la suscripción a este grupo y dejar de recibir sus correos electrónicos, envía un correo electrónico a gdg-barcelon...@googlegroups.com.
Para publicar una entrada en este grupo, envía un correo electrónico a gdg-ba...@googlegroups.com.
Para obtener más opciones, visita https://groups.google.com/groups/opt_out.
 
 

Raúl Muñoz

unread,
Apr 18, 2013, 12:03:10 PM4/18/13
to gdg-ba...@googlegroups.com
http://www.springsource.org/spring-android
esta lib es muy pro, y está muy madura

Sergi Martínez

unread,
Apr 18, 2013, 12:32:57 PM4/18/13
to gdg-ba...@googlegroups.com
Yo he hecho esto: https://code.google.com/p/rarest/

Es un cliente rest que funciona por fichero de configuración



2013/4/18 Raúl Muñoz <raul.munoz...@gmail.com>

Raúl Muñoz

unread,
Apr 19, 2013, 3:54:29 AM4/19/13
to gdg-ba...@googlegroups.com
César, te desaconsejo que uses Android Asynchronous Http Client. He estado mirando el código fuente y hace uso de HttpClient, el cual está desaconsejado a partir de gingerbread. Para hacer conexiones de red se recomienda el uso de HttpUrlConnection.

Lo mismo le pasa a AQuery, que internamente usa HttpClient.

En cambio, Spring Rest Template internamente comprueba la versión de Android y automaticamente te conecta con HttpClient para Froyo e inferiores y UrlConnection para superiores.

My .02

Sergi Martínez

unread,
Apr 19, 2013, 6:56:39 AM4/19/13
to gdg-ba...@googlegroups.com
Mira, en eso no había pensado yo, a ver si lo implemento

2013/4/19 Raúl Muñoz <raul.munoz...@gmail.com>

Rest Template internamente comprueba la versión de Android y automaticamente te conecta con HttpClient para Froyo e inferiores y UrlConnection para superiores

m3n0R

unread,
Apr 19, 2013, 11:40:44 AM4/19/13
to gdg-ba...@googlegroups.com
Muchas gracias Raúl,

de hecho, tiraba de Android Async Http por su facilidad de uso y las posibilidades de personalización. Ya había mirado Spring hace un tiempo, pero creo que no me decanté por él, si no recuerdo mal, por lo que pesaba la librería!

-- 
César Díez

--

Jc Miñarro

unread,
Apr 29, 2013, 4:10:52 AM4/29/13
to gdg-ba...@googlegroups.com
Os dejo esta publicación en la que tratamos un poco el como hacer llamadas
asíncronas a servicios web. No hace referencia a librerías, pero sí a la motodología
a utilizar en dispositivos Android. Creo que es de vuestro interes.
https://plus.google.com/103906121926594713455/posts/S7Sxa12pkEM


2013/4/19 m3n0R <cesary...@gmail.com>



--
Un saludo,
Jc Miñarro

-------------------------------------------------------------------------------------------
CarteleraApp - Consulta la cartelera y estrenos de los cines españoles.
CarteleraApp (AdsFree) - Consulta la cartelera y estrenos de los cines españoles.
Reply all
Reply to author
Forward
0 new messages