7 days of WordPress plugins, themes & templates - for free!* Unlimited asset downloads! Start 7-Day Free Trial
Advertisement
  1. Code
  2. Android SDK

Android desde Cero: Background Operaciones

Scroll to top
Read Time: 8 mins
This post is part of a series called Android From Scratch.
Android From Scratch: How to Store Application Data Locally
Android From Scratch: Creating Styles and Themes

Spanish (Español) translation by Rodney Martinez (you can also view the original English article)

Además de lo más básico de las aplicaciones Android, todo lo que usted construya requerirá de, al menos, algún uso de entorno de hilos para realizar una operación. Esto es debido a que Android tiene algo conocido como un limite de tiempo ANR (Aplication Not Responsive), el cual es causado cuando a una operación le toma cinco segundos o más en el hilo UI, evitando la entrada del usuario y causando que aparece al usuario como la suspensión de la aplicación.

Para evitar esto, usted debe continuar el funcionamiento de las operaciones, tales como solicitudes de red o bajas consultas de bases de datos, por un hilo diferente como si no evitará al usuario continuar desde usando su aplicación. Aunque la cobertura comprehensiva de hilos es un tema largo y complejo en la ciencia de las computadoras, este tutorial le presentará los conceptos fundamentales de los hilos en en Android, y algunas de las herramientas disponibles para ayudar a construir aplicaciones que funcionen mejor usando procesos de fondo.

¿Encuentra más fácil aprender con vídeos? Porqué no revisa nuestro curso:

Comprehensión de Hilado

Cuando una aplicación es ejecutada, un nuevo proceso Linux con una ejecución main es iniciada. Este es el hilo que tiene acceso a los instrumentos de Android UI, atentos a las entradas de los usuarios, y controlando el cuadro para la pantalla del dispositivo. Debido a esto, es comúnmente referido como el UI thread.

Todos los componentes de una aplicación se ejecutan dentro del mismo hilo y de los procesos por defecto, aunque hilos adicionales pueden ser creados para abandonar tareas de los hilos UI y evitar un ANR. Cuando se trata de hilado en Android, hay dos reglas sencillas que deberá recordar para mantener su aplicación funcionando como esperaba:

  1. No bloquee el hilo UI.
  2. No intente acceder a los componentes Android UI desde el exterior del hilo UI.

Si bien puede cumplir con la primera regla mediante la creación de un nuevo Thread y Runnable, para lograr la segunda regla se vuelva un poco más complicado. Considere el siguiente fragmento de código:

Aunque este código no detendrá el hilo UI mientras el hilo suspendió el tiempo límite de la ANR, intentando ajustar el texto TextView, ocasionará que la aplicación lance el siguiente error:

Por fortuna, hay algunas formas sencillas para superar esto. Puede usar el método Android runOnUiThread(Runnable) para ejecutar el código de regreso del hilo main de la aplicación.

O puede tomar un objeto estándar View y post un Runnable para él.

Aunque ambos de estos trucos ayudarán a hacer sus operaciones de hilo seguras, a medida que su aplicación se vuelve más compleja, ésta se volverá más complicada de mantener.

AsyncTask

Una de las herramientas proporcionadas por Android para ayudar a controlar la complejidad con hilos de fondo es AsyncTask. AsyncTask proporciona un hilo trabajador para bloquear las operaciones y luego, publicar el resultado de vuelta para el hilo UI con una devolución de llamada pre-creada del método, permitiendole hacer sus tareas con mucha facilidad sin tener que dejar caer los hilos y los controladores.

AsyncTask Ciclo de Vida

Antes de que empiece a usar la clase AsyncTask, usted necesitará entender el ciclo de vida comparado para ejecutar una operación en el hilo main.

AsyncTask LifecycleAsyncTask LifecycleAsyncTask Lifecycle

El primer método que es llamado por un AsyncTask es onPreExecute(). Este método continua el hilo UI y significa que configurar cualquier componente de la interfaz que necesita dejar al usuario saber lo que está pasando.

Después de que onPreExecute() ha terminado, doInBackground(T) es llamado. El parámetro genérico aquí es cualquier información que usted necesite pasar al método para que éste realice su tarea. Por ejemplo, si usted está escribiendo una tarea que recupera JSON desde una URL, usted le pasaría la URL a éste método como un String. Ya que una operación tiene progreso en doInBackground(), usted puede llamar el método onProgressUpdate(T) para actualizar su UI (tal como una barra de progreso en la pantalla). Aquí el genérico es un valor que representa el progreso, tal como un Integer.

Una vez que el método doInBackground() ha completado, esto puede devolver un objeto que es pasado en onPostExecute(T), tal como JSONObject que fue descargado desde nuestra URL inicial. onPostExecute(T) ejecuta el UI hilo.

Cuando usted crea una clase AsyncTask, usted debe anular estos genéricos en la declaración de las clases y en los métodos anteriores. Un ejemplo AsyncTask que actualiza una ProgressBar cada segundo puede verse aquí:

Puede haber notado que onPostExecute(T) verifica el isCancelled(). Esto es debido a que hay un gran problema con AsyncTasks: ellos mantienen una referencia a un Context, incluso después de que el Context ha sido eliminado.

Esto más fácil de ver cuando inicia un AsyncTask y luego rota la pantalla. Si usted intenta una referencia a un elemento Context (tal como un View o Activity) después que el Context original ha sido eliminado, entonces una Exception será proyectada. La manera más fácil de evitar esto es haciendo una llamada a cancel(true) en su AsyncTask en su Activity o en el método onDestroy() de Fragment y luego validar que la tarea no ha sido cancelada en onPostExecute(T).

Como ocurre en la programación, la respuesta cuando debería usar un AsyncTask es: depende. Aunque AsyncTask son sencillos de usar, no son un todo-debería o toda la solución al proceso de hilado, y son mejor usados para operaciones cortas  en la mayoría de los segundos. Si usted tiene una operación que puede ser más larga, le recomiendo que usted investigue usar ThreadPoolExecutor,  Service o GcmNetworkManager (una versión compatible anterior del JobScheduler).

Services

Cuando necesita realizar un operación prolongada en el fondo, tal como reproducir una música, realizar transacciones de red, o interactuar con el proveedor de contenido, puede que usted desee considerar usar un Service. Un Service básico puede existir en dos condiciones: iniciado y delimitado.

Un Service iniciado es iniciado por un componente en su aplicación y permanece activo en el fondo del dispositivo, incluso si el componente original es destruido. Cuando la tarea que inicio Service está siendo completada, entonces el Service se detendrá. Un Service estándar iniciado es, por lo general, utilizado para las tareas de fondo prolongadas que no necesitan comunicarse con el resto de la aplicación.

Un Service limitado es similar a un Service iniciado y, además, éste proporciona una devolución de llamada para varios componentes de la aplicación que pueden unirlo a él. Cuando todos los componentes vinculados han sido desvinculados desde Service, éste se detendrá. Es importante observar que estas dos formas para ejecutar un Service no son exclusivas —usted puede iniciar un Service que ejecutará indefinidamente y puede tener componentes unidos a él.

IntentService

Uno de los temas más largos con un Service estándar es que éste no puede controlar múltiples solicitudes a la vez, ya que esto sería una pesadilla multi-threading. Una forma de evitar esto es extender un IntentService, lo cual extiende un Service estándar. El IntentService crea un operador de hilo por defecto para ejecutar todos los intents que son recibidos en el método onStartCommand(), de modo que todas las operaciones pueden ocurrir fuera del hilo main. Esto crea una fila de trabajo para enviar cada intent a onHandleIntent() uno a la vez para que no necesite preocuparse acerca de cuestiones multi-threading.

Además de controlar threading, IntentService también se detiene automáticamente una vez que todas las solicitudes han sido controladas. Debido a que todos los detalles de implementación son gestionados en IntentService, el trabajo para usted como desarrollador es bastante sencillo.

En conclusión

En este tutorial, usted ha aprendido mucho sobre soluciones threading y multi-threading en Android. Se han escrito muchos libros sobre threading en Android, pero ahora ya tiene los fundamentos suficientes para crear el código general para las tareas y entender más sobre la documentación para aplicación Android más complejas que realice más adelante.

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.