Esta web utiliza cookies, puedes ver nuestra Aviso sobre política de cookies Si continuas navegando estás aceptándola
Política de cookies +

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.

sábado, 7 de marzo de 2020

Recuperando pestañas perdidas en Google Chrome

Soy de esas personas que abre una pestaña pero no puedo leer ese instante y la guardo porque tiene algo interesante, para leerlo luego, y me pasa que abro otra, y otra pestaña mas, y tengo varias abiertas pero no quiero perderlas hasta leerlas y esa tarea a veces se me prolonga meses hasta poder leerlas.
Pero tengo enemigos: el apagar la maquina, o los cortes de luz, o las actualizaciones de Windows y su reinicio.

Esta alerta la publico el 6 de febrero del 2021; actualmente la solución que plantée(hace tiempo) y  es la sigue a continuacíon........... "THE GREAT SUSPENDER" contiene malware, ha sido retirado de los complementos para Chrome.

Esta por demas, aunque prefiero recalcar, ya no la utilicen, quitenla; 

¿QUE ES UN MALWARE?

Es un software malicioso que abre agujeros de seguridad en un dispositivo, y que a través de este se puede acceder al dispositivo sin conocimiento del dueño ni necesitar una autorizacion, y sabe Dios que haran con ese dispositivo. Entonces el equipo se vuelve vulnerable y por tanto todo lo que este en ese equipo.

 
MEJOR SOLUCION
Existe una extension para Google Chrome llamada The great Suspender, la cual no solamente te guarda las pestañas que has estado utilizando con un historial de fechas, cantidad de ventanas abiertas y cuantas pestañas por cada ventana; Sino que tambien te suspende las paginas que no estas utilizando, es decir, las congela, eso te ayuda cuando restauras una sesion antigua y toodas las pestañas y algun video que otro de youtube empieza a cargar y reproducirse y consumen todo el ancho de banda, al supenderlas, solo carga la que quieras y no todas de golpe.

Chrome también nos permite guardar en marcadores todas las pestañas que tenemos abiertas con (Control + Mayúscula + D), que nos puede venir muy bien.

PASO ALGO Y SE ME PERDIERON TODAS LAS PESTAÑAS Y NO PUEDO REPRODUCIRLAS.
En el caso de que ya haya pasado la desgracia, y se perdieron las pestañas, hay otra solucion, restaurar los archivos que contienen las sesiones y pestañas.
En windows:
C:\Users\USUARIOX\AppData\Local\Google\Chrome\User Data\Default
En linux
/home/usuario/.config/{chrome}/Default
MAC
Users/usuario/Library/Application Support/Google/Chrome/Default

Allí encontramos estos archivos:

  • Current Session
  • Current Tabs
  • Last Session
  • Last Tabs

Estos archivos están en formato binario, y en ellos estan contenidos todos los datos de las pestañas abiertas y las ventanas abiertas anteriormente:

strings Current\ Session
http://www.bodurov.com/JsonFormatter/
https://colorlib.com/polygon/metis/
Estos ficheros podemos copiarlos por seguridad, Current Session con Last Session y Current Tabs con Last Tabs. Es mejor recomendable, antes de cerrar el navegador hacer una copia de seguridad de todos:
cp Current\ Session{,.backup}
cp Current\ Tabs{,.backup}
cp Last\ Session{,.backup}
cp Last\ Tabs{,.backup}
Ahora tendremos Current Session y Current Session.backup , Current Tabs y Current Tabs.backup y así con los demás. Ahora, cerramos el navegador, que seguramente reescriba los archivos (pero no las copias de seguridad que hemos hecho).
Ahora copiamos Last Session.backup en Last Session (y en Current Session también si queremos) y hacemos lo mismo con Last Tabs.backup:
cp Last\ Session.backup Current\ Session
cp Last\ Session.backup Last\ Session
cp Last\ Tabs.backup Current\ Tabs
cp Last\ Tabs.backup Last\ Tabs

Lo propio con windows, copiamos los archivos a otra carpeta, y de esta tras cerrar el navegador, hacemos la copia y el reemplazo de  estos archivos:
Copiar Last Sesion y reemplazar a Current Session
Copiar Last Tabs y reemplazar Current Tabs
 .
Al iniciar Windows ya cargara con la informacion guardada en los archivos.

Otra opcion es tener habilitado en estos archivos la opcion de restaurar a versiones anteriores. Y restaurar a fechas anteriores el estado del archivo, aunque es mas complicado.

Espero esto sea de ayuda.