Archive for the ‘Java’ category

Introducción a Android Studio (notas del curso de Android)

9 mayo, 2019

Hola a todos,

hoy les comparto una introducción a Android Studio. Vamos a conocer un poco de su historia, sus funciones principales y cómo nos ayuda a provechar el framework de Android.

El enlace a las notas: http://www.nachintoch.mx/teaching/mobile_dev/Android-Studio.pdf

Anuncios

Android como plataforma de desarrollo

25 abril, 2019

Hola a todos,

Trayéndoles las siguientes notas del curso de Android, ahora vamos a conocer a Android como plataforma de desarrollo. Conoceremos las herramientas con las que podemos producir aplicaciones Android, cómo se administra la ejecución de las aplicaciones, cómo y qué se debe tomar en cuenta al desarrollar una aplicación.

Aquí las notas: http://www.nachintoch.mx/teaching/mobile_dev/android-framework.pdf

Android y Picasso: como resolver cargas infinitas (pérdida de objetivos-Target)

13 junio, 2017

Hola a todos!

Si usas Picasso como una biblioteca tercera en tu aplicación Android, es posible que las descargas de imágenes hechas con Picasso parezcan nunca terminar.

Si activamos la caracterísitca de depuración de Picasso; como se muestra a continuación,

Picasso picasso = new Picasso.Builder(context).loggingEnabled(true).build();

al iniciar una carga con picasso, indicando algún objetivo

picasso.load("http://www.nachintoch.mx/images/shell_sort.gif").into(target);

es posible que veamos el siguiente mensaje en la consola de depuración (“Monitor Android”):

target got garbage collected

Esto significa que se ha ejecutado el recolector de basura y se ha llevado el target que le hayamos dado a Picasso al iniciar la carga. Al haber perdido el target, la imagen nunca se mostrará en el mismo y puede dejar nuestra aplicación en un estado inadecuado.


Esto ocurre debido a que Picasso mantiene referencias débiles a los target, por lo que son susceptibles a ser recolectados. Y aunque nuestra aplicación requiera un bajo consumo de recursos, siempre existe la posibilidad de que existan múltiples servicios en ejecución o alguna otra aplicación de alto consumo de recursos; como los juegos, y el SO al requerir liberar recursos, invoque el recolector de basura y ocurra este problema con los target.

Por lo anterior; considero una buena práctica aplicar siempre esta solución cuando se trabaje con Picasso para mitigar riesgos…


Si alguna vez has trabajado con referencias; por ejemplo, al implementar listas ligadas, probablemente tengas ya una idea de la solución, y es que es bastante simple.

Basta con mantener una referencia a nuestro target en el programa. No importa si declaramos una variable específica para los target, o si los almacenamos en un arreglo o en alguna estructura de datos; como una lista, un mapa o una cola concurrente.

Para hacer esto, podemos hacer lo siguiente. Puesto que Picasso requiere que los target implementen la interfaz com.squareup.picasso.Target podemos aprovechar los métodos que nos obliga a implementar en los target.

Para mantener una referencia a los target y evitar que sean recolectados, al iniciar la carga; hacemos la referencia al target:

Target target = someTarget;

Target[] targets = new Targets[]{someTarget};
LinkedList<Target> targets = new LinkedList<>();
targets.add(someTarget);
picasso.load("http://www.nachintoch.mx/images/rgb.jpg").into(someTarget);

Una vez que se haya realizado la carga, será invocado el método de Target onBitmapLoaded o onBitapFailed; dependiendo de si la carga fue exitosa o no. En ambos, incluimos el siguiente código para liberar los targets y con ellos el espacio en memoria: queremos que el recolector se lleve los targets después de que la carga haya concluido; no antes.

if(target == this) target = null;

int index = Arrays.asList(targets).indexOf(this);
if(index >= 0) targets[index] = null;

targets.remove(this);

Dependiendo de la estrategia que hayas usado para mantener una referencia “fuerte” al target y evitar la recolección de basura sino hasta este punto del programa; donde es esperado que ocurra.


Así que en pocas palabras, la solución a la recolección de los targets durante la carga con Picasso es mantener una referencia al target directamente.

Espero esto saque de algún apuro a alguien, yo perdí un día completo para descubrir esta solución y que el límite sea la imaginación.

¡Primera versión estable de la biblioteca de utilidades para Java & Android!

15 septiembre, 2016

¡Hola cibernautas!

Hace como 3 años; sinceramente ya no recuerdo bien cuanto tendrá de esto (y me da flojera buscarlo en el histórico de publicaciones honestamente), anuncié que llevaba algún tiempo trabajando con una biblioteca de propósito general para Java.

Posteriormente; conforme fui desarrollando nuevos proyectos, la encontré útil también para desarrollar aplicaciones nativas en Androd… Pero también me empezó a ganar el proyecto.

Entre que todavía estaba terminando mis créditos de grado, tenía un trabajo -muy- demandante y factores personales, por allí del 2014 me ví en la necesidad de meter el proyecto a la nevera.

La verdad hasta lo había olvidado, hasta que el año pasado integré algunas cosas que usé para el curso de computo concurrente de ese momento.

Luego la miré con ojos más fríos y decidí que había muchas cosas redundantes porque las podemos encontrar con mejores implementaciones en las bibliotecas de Java o ya habían sido resuelto de mejor manera por otros desarrolladores, y empecé a seleccionar aquellas clases que consideré realmente útiles.

Quizá la más útil de todas sea Sprite; que como su nombre sugiere, modela una hoja de animaciones bidimensionales y además le da características físicas, como masa, fricción y fuerza; para simular movimientos como se acostumbra hacer en los videojuegos.

El resto son básicamente “hijas” de las clases envolventes de tipos de datos primitivos de Java, pero con la adición de extender a comparable. Quizá esto ya no sea tan novedoso desde que Java 7 nos permite usar objetos como números (cuando son de la clase Byte, Integer, Double u otras que en efecto representan números); pero aún así pueden ser de utilidad para usarlo con estructuras de datos como listas o hashes que requieren de objetos comparables para ordenarse.

Así que con esto, entrego lo que es deuda. Algunos notarán que ya había una versión publicada, pero no estaba terminada y tenía algunos problemas.

Sin más, les dejo enlace a:

Espero que les sea de utilidad.

Java: Introducción a la programación usando hilos de ejecución

7 septiembre, 2016

Hola a todos!

En esta ocasión les comparto un material que nos introduce a la programación con hilos en Java. Las notas asumen que el lector está familiarizado con el lenguaje (Java).

Las notas nos dan a conocer cómo trabajar con hilos y cual es su utilidad; a grandes rasgos en qué casos de uso debemos utilizarlos. Nos enseña a crear hilos y cómo configurarlos para que se comporten de distintas formas; interrumpirlos y cómo reanudarlos y por supuesto: cómo hacer que se ejecuten varias tareas al mismo tiempo en un mismo programa.

Las notas aprovechan y nos dan a conocer algunas primitivas de sincronización incluidas en Java.

También se nos explica qué son los thread pools… Que no tienen nada que ver con fiestas de hilos en albercas; pero nos permiten tener un arsenal de hilos listos para ejecutarse, haciendo más eficiente el uso de hilo, al coste de mayor uso de memoria. Las thread pools son bastante útiles cuando la funcionalidad de nuestra aplicación incluye atender varias fuentes asíncronas simultáneamente, en tiempos diferentes.

Finalmente, nos hablan de Callable, Future y SwingWorker; que nos permiten explotar los hilos de distintas maneras y tener un mejor control sobre el flujo de su ejecución, en un mundo donde no hay forma de explícitamente saber o controlar los tiempos y turnos que toman para su ejecución.

A continuación las notas: http://www.nachintoch.mx/teaching/concurrent_computing/18ago-Threads.pdf

Las notas tienen el siguiente anexo: http://www.nachintoch.mx/teaching/concurrent_computing/ejemplo_hilos.zip

También hacen referencia al siguiente ejemplo de calendarización: http://www.nachintoch.mx/teaching/intro_data_structure/ejemplo_calendarizador.zip

Java Swing: Introducción a las Interfaces Gráficas de Usaurio

6 septiembre, 2016

Hola de nuevo!

En esta ocasión; vengo a chorearlos queridos cibernautas, con las interfaces gráficas de usuario; mejor conocidas como GUI por sus siglas en inglés. El desarrollo de software; mejor dicho, aplicaciones que usan una GUI es bastante interesante y es un tema muy muy extenso; tan extenso que es difícil que una persona pueda con el desarrollo íntegro de ellas

Ya que involucra los aspectos más técnicos de programación y dominio de conocimiento sobre computación concurrente y administración de recursos. Por otro lado, involucra aspectos mucho más artísticos, como la distribución de espacios, selección de colores, fuentes de texto; etc.

Esta pequeña introducción nos da a conocer algunos de los aspectos más elementales para programar GUIs usando Java Swing. Se recomienda ampliamente el uso del IDE NetBeans, ya que contiene una herramienta para el desarrollo de GUI basado en Swing que abstrae algunas de las cuestiones técnicas que pueden resultar muy engorrosas para los programadores que empiezan a adentrarse en el desarrollo de GUIs.

Para usar la mencionada herramienta gráfica de NetBeans, primero debemos haber creado un proyecto que corresponda a una “aplicación de Java”. Damos click derecho sobre nuestra aplicación de Java y seleccionamos “New”  y acontinuación “Java Frame Form”. Notará que sobre el área de trabajo aparecerá un nuevo botón que dice “Design”. Este nos lleva a un panel de edición en el que podemos manipular el tamaño de nuestra ventana (o contenedor cuando extendemos a un JPanel) y simplemente arrastrar y colocar los elementos de Swing que queremos en la posición que necesitamos, ahorrándonos la molestia de administrar manualmente los layouts.

¿Qué es un elemento de Swing? Aquí el texto: http://www.nachintoch.mx/teaching/concurrent_computing/intro_GUI.pdf

Bonus level: Programa de ejemplo: http://www.nachintoch.mx/teaching/concurrent_computing/guis.zip

Estructuras de datos aplicadas – Ejemplo de árboles: sistemas de archivos

5 septiembre, 2016

Saludos a todos,

después de casi medio año sin publicar nada; he vuelto de los rincones más fríos y oscuros de la vida y sus constantes altibajos; de pendiente prácticamente infinita pensada como derivada 😛 Y esta semana procuraré ponerme al corriente con el material que he trabajado en este tiempo.

En fin, en este post les dejo unas notas en las que se ejemplifica la estructura de datos árbol usando sistemas de archivos.

Muchos sistemas operativos, trabajan con sistemas de archivos que ocupan una jerarquía de directorios para organizar los archivos del sistema y sus usuarios.

Por ejemplo, Windows usa varios árboles enraizados en cada unidad. Así, el disco duro principal del sistema se identifica como C:\ y los directorios que contiene son hijos de este nodo raíz C:\; por ejemplo, users, windows, program files, etc. Y a su vez, estos directorios son raíces de más subárboles enraizados en ellos, y así sucesivamente.

Linux y Mac; en general los sistemas POSIX-compatibles, usan un sólo árbol que agrega dinámicamente los subárboles de los dispositivos que se le conecten o inserten al sistema; tales como memorias USB, CD, smartphones, etc…

Los archivos en todo caso, son siempre hojas en los árboles de los sistemas de archivos.

Y el enlace a las notas: http://www.nachintoch.mx/teaching/intro_data_structure/21_abr-EjemploarbolesSA.pdf

Y un ejemplo en Java: http://www.nachintoch.mx/teaching/intro_data_structure/ejemplo_arboles_archivo.zip

Saludos!


A %d blogueros les gusta esto: