Esta web utiliza cookies, puedes ver nuestra Aviso sobre política de cookies Si continuas navegando estás aceptándola
Política de cookies +
Mostrando entradas con la etiqueta hebra. Mostrar todas las entradas
Mostrando entradas con la etiqueta hebra. Mostrar todas las entradas

sábado, 20 de junio de 2020

Programando en hilos "android.os.networkonmainthreadexception"

Puse como titulo, un error que devuelve el desarrollo en android cuando intentamos hacer correr una rutina en el hilo principal, y no en un hilo secundario tal como nos sugieren las buenas practicas. Comencemos..

¿Qué es?

En ingles se escribe Thread y la traducción mas clara es "hilo" tambien en alguna referencia usan el termino "hebra", siendo la primera la mas común. Un hilo es un proceso ligero ó subproceso, una secuencia de tareas encadenadas muy pequeña que puede ser ejecutada por un sistema operativo.

Todo programador especialmente de aplicaciones Android, en algún momento necesita conocer sobre el manejo de hilos, y gestionarlos dentro de su aplicación.


Si tenemos un mobile, le damos click en el icono de una aplicación para que se abra, el dispositivo ya tiene otras aplicaciones abiertas, y abrirá una mas en un nuevo hilo, es así, que podríamos decir que cada aplicación es un hilo. Estos son independientes, es decir las aplicaciones, no deberían de afectar una a la otra, ahora entonces, cuando estamos en una aplicación vemos que tenemos cosas como descarga de imágenes, accesos a las bases de datos, etc.

Estas tareas normalmente tienen un problema: no sabemos cuanto tiempo van a tardar, de hecho corremos siempre el riesgo de que la tarea no se complete.

Pongamos el ejemplo de una aplicación descargando una imagen, con una conexión a internet lenta, el usuario al no ver que la imagen se muestra en su teléfono puede pensar que la aplicación no funciona o simplemente se quedó colgada, pero en realidad solo está tardando. Entonces, tenemos un problema ya que cada aplicación es un solo hilo y necesitamos el hilo para trabajar con la imagen y ya que esta tarea está pendiente no podremos avanzar. Los hilos nos ayudan a resolver estos problemas.

Por tanto se pueden crear tantos hilos sean necesarios, generalmente un hilo para cada tarea donde necesitemos correr éstos paralelamente. Existe una diferencia de opiniones entre si esto es una ventaja o desventaja al momento de programación por el tema de complejidad.

¿Cómo usar?


Una aplicación móvil bien hecha hoy en día crea un hilo para tareas como descargas, conexiones, etc. es así que la aplicacion no se cuelga esperando que se concluyan tareas que estén tomando tiempo. Los hilos también, nos permiten separar tareas complejas en tareas mas simples y concretas, ademas nos permite fallar y que esto no sea tan grave, se divide las tareas en hilos y si tenemos algún problema el impacto no es tan negativo.

La destrucción de hilos antiguos por nuevos es una característica que no deja realizar varias tareas a la vez (concurrentemente). Los distintos hilos de ejecución comparten recursos como espacio de memoria, archivos abiertos, caso de autenticación, etc. 

Esta técnica permite simplificar el diseño de una aplicación que debe llevar a cabo distintas funciones simultáneamente.


El main thread es el hilo principal del programa, donde esta los principales eventos que conectaran con otros modulos del programa, asi como las interfaces graficas.


Y en este, se arma la forma como consumiremos nuestros accesos a archivos, conexiones, recursos del dispositivo, etc etc. Esta parte de la mano de una arquitectura adecuada, nos ayudara a tener clara y mantenible nuestra aplicacion android.


Ejemplos:

Debemos seguir dos reglas:

    No bloquear el hilo principal.
    Todas las operaciones de interfaz gráfica se hacen en el hilo principal.

Android ofrece muchas maneras para crear y administrar hilos, y existen librerías de terceros que hacen que la gestión de hilos en Android sea mucha mas sencilla y agradable para el programador.

Las operaciones de red, y las llamadas a la base de datos, servicios web y la carga de algunos componentes (Ej. imágenes de internet), son ejemplos comunes de operaciones que uno como programador debe evitar hacerlo en el hilo principal.

Categoricemos los componentes de subprocesamiento en dos categorías:
  • Subprocesos adjuntos a una actividad / fragmento: estos subprocesos están vinculados al ciclo de vida de la actividad / fragmento y finalizan tan pronto como se destruya la actividad /fragmento.
  • Subprocesos que no estan adjuntos a una actividad / fragmento: estos subprocesos pueden seguir ejecutandose más allá de la duración de la actividad / fragmento (si corresponde ) de la que se generarón.

Android permite crear hilos o subprocesos adicionales, para ejecutar tareas de larga duración. Una vez terminada la tarea podemos regresar al hilo principal para actualizar la interfaz de usuario.

El la imagen de ejemplo, en el ciclo de vida de la aplicaicon, desde que se le da clic en su icono, se crea la aplicacion en su MainThread, (pero un nuevo hilo para el S.O. android del celular), el cliclo de vida del hilo principal esta en azul, en un tiempo X de ejecucion ejecutamos una consulta a un webservice el cual se ejecuta en un nuevo hilo, que colocamos en color rojo, el cual se quedara corriendo por tiempo indefinido consumiendo constantemente ese webservice, y un tercer  hilo de colro verde de impresion de un documento o reporte, y el hilo es cerrado una vez que concluye la impresion.


Para realizar la implementación de un hilo en android, hay seguir los siguientes pasos muy básicos:
  1.     Extender la clase Thread.
  2.     Implementar el médoto run().
  3.     Para actualizar la interfaz de usuario, utilizar el método runOnUiThread().
A continuación para probar este proceso, agregamos un botón a nuestra actividad, colocamos el siguiente código sencillo que explica el proceso anterior:

Este codigo hace que la aplicación queda bloqueada por unos 10 segundos al hacer clic, y no permite realizar otra tarea.

Haciendo un cambios al ejemplo anterior, se agrega un Progressbar debajo:
Y corregimos el codigo a:
La aplicación llama al subproceso a través del clic al botón, que se ejecuta en un subproceso secundario, y no afecta el hilo principal.