AndrPills: mostrando mensajes con AsyncTasks desde un contexto de aplicación

Tras un pequeño parón vacacional en el que he podido descansar y sobre todo reflexionar (os lo recomiendo de vez en cuando, de verdad, es necesario quitar el piloto automático y tomar perspectiva) traigo en la mano una nueva píldora sobre una de las situaciones en que me gusta usar AsyncTasks.

En uno de mis últimos proyectos tenía que mostrar al usuario un mensaje (Toast) con el estado (Correcto | Error) de la última sincronización de datos realizada. Para ello, disponía de un contexto de aplicación, sin embargo, no disponía de un contexto de actividad (Activity) desde el que fácilmente poder mostrar el Toast mediante el método runOnUiThread() que tiene acceso al hilo de UI.

Las opciones para poder implementar el comportamiento deseado, como siempre, eran varias: Threads y Handlers, Loopers y AsyncTask (si utilizáis alguna otra, encantado de recibir sugerencias en los comentarios)

En este caso, he elegido la opción AsyncTask, quizás por lo castigada que ha sido por la comunidad 😉 , creo recordar varios artículos al respecto, y porque creo que «bien» usada es muy útil, ofreciendo como veréis en el ejemplo mucha limpieza/sencillez en el código.

Recordemos su definición: Una AsyncTask permite ejecutar  tareas asíncronas en la interface de usuario. Para ello, utiliza un worker thread que publica el resultado en el hilo de UI cuando finaliza sin necesidad de usar handlers o mecanismos similares.

Resumiendo, es muy cómoda.

Supongamos que tenemos la clase SyncAdapter.java que se encarga, como su nombre indica, de la tarea de sincronización en segundo plano de los datos de la aplicación.

public class SyncAdapter extends AbstractThreadedSyncAdapter {

public SyncAdapter(@ForApplication Context context, boolean autoInitialize, other params...) {
       super(context, autoInitialize);
       this.context = context;
}

@Override
public void onPerformSync(Account account, Bundle extras, String authority, ContentProviderClient provider, SyncResult syncResult) {
   if(some_error_synchronizing) {
      new ShowErrorMessageToast().execute((Void[])null);
   } else {
      ...
   }
);

private class ShowErrorMessageToast extends AsyncTask<Void, Void, Void> {
   protected Void doInBackground(Void... param) {
           return null;
       }

   protected void onPostExecute(Void param) {
      Toast.makeText(context, R.string.sync_error_message, Toast.LENGTH_LONG).show();
   }
}
...
}

Como veis, únicamente definimos nuestra AsyncTask para poder ejecutarla cuando sea  necesario, en nuestro ejemplo, al producirse un error durante el proceso de sincronización.

¿Qué os parece la píldora? Espero que os sea de utilidad. Saludos y hasta la próxima cápsula!!

Enlaces de interés

AsyncTask | https://developer.android.com/reference/android/os/AsyncTask.html

2 comentarios en “AndrPills: mostrando mensajes con AsyncTasks desde un contexto de aplicación

Deja un comentario

  • contacto@pinicius.com
  • (+34) 616810829