Oct 182015
 
El sistema Operativo Android utiliza un núcleo Linux, sobre el que van montadas varias capas de software que le dan la forma final que estamos acostumbrados a ver en nuestros smartphones y tablets [1]. Esto facilita la adaptación de softwares originálmente desarrollados para Linux.

Corbin Champion desarrolla y mantiene una versión de Octave para dispositivos Android que incluye todas o casi todas las funcionalidades de Octave. Podemos ejecutar en la consola todas las funciones de Octave, utilizar todos los tipos de datos, ejecutar programas .m y dibujar gráficos sofisticados

Si buscamos ‘Octave‘ en la Google Play veremos que nos aparecen varias aplicaciones. La aplicación denominada Octave, (ver figura), es la versión que funcionaba hasta Android 4. A partir de esta versión, las modificaciones introducidas por Google en el sistema operativo Android hicieron que dejara de funcionar. Es una desagradable costumbre de Google que nos trae de cabeza a los desarrolladores, y que hace que cada pocos meses algunas aplicaciones dejen de funcionar correctamente con la aparición de nuevas versiones del sistema operativo.

Aplicaciones Android en la Google Play

Aplicaciones Android en la Google Play

La aplicación denominada GNU Root Octave [2] es la versión actual de Octave para Android y es la que debemos instalar en nuestros dispositivos. Para que nos funcione, tenemos que instalar y ejecutar previamente la aplicación denominada GNU Root Debian [3], que instala diversas librerías necesarias para el funcionamiento correcto de Octave. Al ejecutar GNU Root Debian aparecerá una consola del sistema y veremos que se ejecutan un montón de instrucciones, a medida que se cargan e instalan los distintos componentes. No debemos interrumpir ese proceso. Tampoco debemos asustarnos, no está haciendo nada ‘malo‘ en nuestro smartphone o tablet, solo instalando librerías.

Una vez instalado y ejecutado GNU Root Debian, podemos instalar y ejecutar GNU Root Octave, que es el Octave propiamente dicho. A partir de ahí dispondremos en nuestro dispositivo de una consola Octave con toda la potencia que ello aporta, convirtiendo nuestro smartphone o tablet en la mejor calculadora.

Para utilizar cómodamente Octave sobre Android es conveniente instalarse un buen teclado. Yo utilizo Swift Key [4], que permite disponer de un cómodo teclado numérico que incluye todos los signos de operaciones aritméticas, acceso a las teclas de movimiento del cursor para editar expresiones, acceso a las teclas Alt, CTRL y otras opciones no disponibles en el teclado que traen por defecto los dispositivos Android.

[1] ¿Qué significa que Android esté basado en Linux?

[2] GNU Root Octave

[3] GNU Root Debian

[4] Teclado Swift Key

 



Santiago Higuera (18 de octubre de 2015)

Feb 282014
 

Cuando arrancamos una aplicación Android, el sistema operativo crea un nuevo ‘hilo’ de procesamiento para la aplicación. En ese hilo, llamado hilo principal, es donde se ejecutan todas las operaciones del programa, incluidas las tareas relacionadas con la actualización del interfaz de usuario. Es por ello, que cuando realizamos una operación que consuma un tiempo apreciable, dejamos momentaneámente congelado el interfaz de usuario. Durante ese tiempo el interfaz no responderá a las acciones como pulsar botones, actualizaciones de pantalla, etc. En suma, es como si se quedara temporalmente colgada la aplicación. Ejemplos de este tipo de operaciones pueden ser el acceso a ficheros de la tarjeta de memoria, las consultas a través de internet o la inicialización de objetos complejos. Con el fin de que el interfaz de la aplicación atienda adecuadamente en todo momento a los eventos generados en el interfaz de usuario, es conveniente que dichas operaciones se hagan en otro hilo de procesamiento diferente del hilo principal

Android dispone de la clase AsyncTask pensada para dar solución a numerosas situaciones como las planteadas. La clase AsyncTask tiene un funcionamiento muy similar al que ofrece la clase SwingWorker cuando se trabaja en entornos Java-Swing

Para utilizarla tendremos que derivar una clase que descienda de AsyncTask y sobreescribir, al menos, el método doInBackground(). Todo lo que ejecutemos dentro de ese método se ejecutará en un hilo propio creado por AsyncTask, diferente del hilo que instanció nuestra clase, que generalmente será el hilo principal. AsyncTask ofrece otros métodos que nos permitirán comunicarnos con el hilo principal y transmitirle el progreso del proceso o el resultado final del mismo. Se trata de los métodos onProgressUpdate() y onPostExecute(). Si sobreescribimos estos métodos, todo lo que ejecutemos en ellos se ejecutará en el hilo principal. El método onProgressUpdate() se ejecutará cada vez que llamemos al método publishProgress() explicitamente desde dentro del método doInBackground(). El método onPostExecute() es llamado automáticamente cuando finaliza el proceso de doInBackground().

Hay tres clases genéricas que debemos indicar al derivar nuestra clase de AsyncTask: La primera corresponde al tipo de los parametros que recibe el método doInBackground(). La segunda corresponde a los parámetros que recibe el método onProgressUpdate(). La tercera clase es la de los valores devueltos por el método doInBackground() que coincide con los parámetros que se pasan al método onPostExecute()..

Veamos un ejemplo de un worker que actúa de contador. Dentro del método doInBackground() se va incrementando un contador cada segundo. Cada vez que incrementa el contador, manda publicar el resultado en un TextView existente en el UI.

Hay que destacar que el método ‘onProgressUpdate() recibe un array de parámetros del tipo declarado. Puede suceder que enviemos un mensaje a publicar y no sea publicado inmediatamente. En cualquier caso, cuando se ejecute el método, dara salida a los mensajes pendientes.

Vemos la forma de invocar la tarea desde la actividad principal: primero se instancia un objeto de la clase y luego se llama a su método ‘execute()‘. Podemos forzar que nuestra Activity espere el resultado de la tarea asíncrona llamando al método get() de la siguiente manera:

Esto forzará al hilo principal a esperar un resultado antes de seguir.

Por último, indicar que esta clase está pensada para tareas de corta duración, pongamos unos pocos segundos. Para tareas que lleven más tiempo, Android dispone de otros mecanismos específicos como los Service. También es posible utilizar el mecanismo de Threads y ThreadPools de Java. Encontraréis más documentación en Processes and Threads



Santiago Higuera (28 de febrero de 2014)

Jan 282014
 

Los dispositivos Android disponen de un almacenamiento, denominado la ‘sdcard‘ que hace las veces de disco duro. Ahí se guardan las aplicaciones, los datos e incluso el sistema operativo. Para acceder al contenido de la sdcard se utiliza el método ‘getExternalStorageDirectory()‘ de la clase Environment

En cambio, cuando el dispositivo lleva una tarjeta de memoria adicional, no está estandarizada la manera de acceder a ella. Cada fabricante la monta en un directorio diferente. Una posible forma de arreglar el problema es el método ‘getSecondaryStorageDirectories()‘ que os proponemos a continuación. Si bien no es un método muy ortodoxo, en los dispositivos Android que tengo a mi alcance ha funcionado perfectamente. El código del método propuesto es el siguiente:

Lleva añadidas algunas sentencias ‘Log‘ para facilitar su exploración. Hay que destacar la forma en que se discriminan los dispositivos USB. También es interesante el método ‘System.getenv()’ que nos permite explorar las variables del sistema [1]. La sentencia System.getenv(“SECONDARY_STORAGE”) nos devuelve una cadena con una serie de paths separados por dos puntos. De ahí la necesidad de discriminar los USB.

Para realizar el método getSecondaryStorageDirectories() he consultado varias páginas de internet, pero sin duda la que más me ha abierto los ojos ha sido esta de StackOverflow.

[1] Vease en ese sentido el artículo ‘System.getenv() Method – System Environment Variables’ de Dr. Herong Yang



Santiago Higuera (28 enero 2014)