De Arduino a Android y de vuelta


Apesar de mi gran interés en la electrónica, siempre ha sido una area flaca, básicamente por mi dificultad de entender la parte de las Leyes de Ohm y el resto de su teoría. Y es que a mi me gusta aprender haciendo y cuando descubrí Arduino fue como que oyeran mis plegarias.

No voy a ahondar mucho sobre que es Arduino, básicamente es una plataforma electrónica de código abierto, para crear objetos interactivos al ambiente. Si usted desea aprender más sobre Arduino, le recomiendo que se dé una vuelta por el sitio oficial que es http://www.arduino.cc y en español http://www.arduino.cc/es/.

Yo me compré este Starter Kit en Sparkfun (amazon / sparkfun), que viene con un Arduino Uno, varios sensores (temperatura, luz, flexibilidad, etc), algunos LEDs, resistencias, mini protoboard y jump wires. Lamentablemente por cuestiones de tiempo lo tuve guardado varios meses.

Al ver el anuncio en Google IO 2011 sobre el Android Open Accessorie Developer Kit (ADK) y de que podía comunicarse con Android y que además el hardware era compatible con Arduino dije: -¡Ahora sí! pero en ese momento el costo del ADK board era alrededor de los $300. Otro problema es que el ADK solo es compatible con dispositivos 2.3.4+. Como era compatible con Arduino, pensé que debía de haber alguna forma de poder hacer el ADK y efectivamente, ya alguien vió el mismo problema y puso en su blog, como hacer su propio (DIY) ADK board.

Ronfont en su sitio web, posteó los pasos de como instalar el ADK en un Arduino + USB Host Shield (ver post aquí). No le bastó y 3 días después, publicó un post, donde “hackeó” el protocolo ADB para poder hacer comunicar a un dispositivo Android con la pareja Arduino+USB Host Shield. Esto se convirtió en un proyecto de código abierto llamado MicroBridge que permitiría a dispositivos de 1.5 en adelante, comunicarse con Arduino.

Ésta no es la única forma de poder comunicar un Arduino con Android. Otra opción basada en USB, es la tarjeta IOIO (en inglés se pronuncia como yo-yo) creada por Sparkfun. SeeedStudio creó su propia version llamada SeedDuino ADK Mainboard. Microship también ofrece el chipKIT. ITeadStudio tiene su version llamada Iteaduino ADK Main board. Todas andan alrededor de los $80 actualmente.

Además de las opciones USB, hay otra opción de comunicar a Android con Arduino mediante Bluetooth. Primero se ocupa un módulo Bluetooth, y de esos también hay bastantes sabores. De los que yo conozco estan el BlueSmirf y los Bluetooth Shield (slave y slave/master).

Existe un proyecto de código abierto llamado Amarino que ofrece un API para Android y la librería para Arduino. Ya lo utilicé y es bastante sencillo una vez comprendido las bases.

Espero que esta información introductoria les sea de utilidad, proximamente postearé más información con ejemplos reales. Pueden revisar mi blog en la sección de Arduino, ahi ya he colocado un par de videos de mi pruebas con Microbrige.

Referencias:

  1. Google’s Open Accessory Development Kit on Standard Arduino Hardware.
  2. MicroBridge: ADB support for Arduino
  3. Amarino

Usando efectívamente el AsyncTask Parte 1

Imaginemos, por ejemplo, la aplicación de Twitter, que al iniciar su ejecución hace un llamado a un método del API de Twitter. Éste llamado tomará su tiempo dependiendo del tipo de conexión del usuario. Mientras se obtienen los tweets más recientes, no queremos que la aplicación se congele provocando un ANR (Application Not Responding) y un eventual Force Close de la aplicación. Por ello, Android provee al desarrollador de diferentes herramientas para ejecutar tareas en hilos a parte del hilo principal, entre ellas, las clases Handler(desde API Level 1) y AsyncTask (desde API Level 3).

El AsyncTask es ampliamente utilizado para ejecutar tareas “simples” o “atómicas” en un hilo aparte. Su ciclo de ejecución es bastante intuitivo y práctico, comparado con el uso de la clase Handler. En Android 1.5, los AsyncTask eran encolados y un único hilo se encargaba de ejecutarlos uno por uno. A partir de 1.6 hasta Android 2.3.4 (inclusive), los AsyncTask son ejecutados cada uno por un hilo aparte (sin asegurar su orden). Aqui la clase AsyncTask maneja una cola de ejecución de 10 hilos(dato no confirmado) y una cola de 10 hilos en espera (aunque según Roman Guy aquí, ese límite ya no existe, aunque no indica en que versión :-/), dándonos aproximádamente 20 AsyncTask “simultáneos”. Cuando este límite se excede, se dispara la excepción RejectedExecutionException. Está planeado despues de Honeycomb (Android 3.0) volver a la ejecución sencilla, para evitar los errores de ejecución paralela.

Esta clase es muy útil pero a la vez se convierte, probablemente, en una de las mayores fuentes de memory leaks y application crashes (Force Close) en Android. En este primer artículo hablaremos primero sobre los Inner clases y cómo definir una AsycTask adecuadamente.

1. Inner clases

Tal vez la razón número uno de leaks en una aplicación Android son las Inner classes dentro de una clase Activity. Las Inner class, tienen una referencia implícita hacia la Outer class. Cuando se crea un AsyncTask, la tendencia es hacerlas dentro de la Actividad donde la ocupamos. Veamos un ejemplo

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Inicialización de la actividad, layout, etc
        MyLongTask task = new MyLongTask();
        task.execute("http://blog.fr4gus.com/api/test.json");
    }

    @Override
    protected void onPause() {
        // Persistamos cualquier cosa que ocupemos
    }

    class MyLongTask extends AsyncTask<String, Void, Void>{

        @Override
        protected void onPreExecute() {
            // Avísele al usuario que estamos trabajando
        }

        @Override
        protected Void doInBackground(String... params) {
            // Aquí hacemos una tarea laaarga
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            // Aquí actualizamos la UI con el resultado
        }
    }

}

El problema es que éstas inner classes no-estáticas no tienen un ciclo de vida controlado por el desarrollador. La solución está en hacer las classes Inner, estáticas y pasarle la referencia de la actividad o contexto, pero envolviéndola dentro de un WeakReference. Esto permitirá al Garbage Collector, liberar la memoria del Activity aunque el AsyncTask siga ejecutándose. Es importante que a la hora de usar el WeakReference, se aseguren que la referencia al Activity sea aun válida, verificando que no sea nula y que la activdad no esta terminando.

public class MyActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // Inicialización de la actividad, layout, etc
        MyLongTask task = new MyLongTask(this);
        task.execute("http://blog.fr4gus.com/api/test.json");
    }

    @Override
    protected void onPause() {
        // Persistamos cualquier cosa que ocupemos
    }

    static class MyLongTask extends AsyncTask<String, Void, Void> {
        WeakReference<MyActivity> context;

        public MyLongTask(MyActivity activity) {
            context = new WeakReference<MyActivity>(activity);
        }

        @Override
        protected void onPreExecute() {
            // Avísele al usuario que estamos trabajando
        }

        @Override
        protected Void doInBackground(String... params) {
            // Aquí hacemos una tarea laaarga
            return null;
        }

        @Override
        protected void onPostExecute(Void result) {
            MyActivity activity = context.get();
            if (activity != null &#038;&#038; !activity.isFinishing()) {
                // Aquí actualizamos la UI con el resultado
            }
        }
    }

}

Parte 2

Fuentes

  1. Documentación de Android sobre memory leaks http://developer.android.com/resources/articles/avoiding-memory-leaks.html
  2. Límite de ejecución de los AyncTask: http://stackoverflow.com/questions/2492909/asynctask-rejectedexecutionexception-and-task-limit
  3. Implementación de AyncTaskEx de CommonsGuy: https://github.com/commonsguy/cwac-task

nDroidEs Episodio 2

Volvemos esta semana con nDroidEs Episodio 2

nDroidEs Episodio 2 from Franklin Garcia on Vimeo.

nDroidEs es un espacio en español para aquellos desarrolladores que quieran iniciarse en el mundo de Android. Es importante recalcar que Android es una plataforma creada por

el Open Handset Alliance, liderada por Google. Para desarrollar en este ambiente es necesario tener conocimientos precios en desarrollo de aplicaciones.

Este episodio trata de:
1- Limites y Restricciones de Android
2- El Archivo AndroidManifest.xml
3- Estructura del proyecto Android
4- Preguntas y Respuestas
5- Noticias

Memoria Heap e Imágenes
http://android-developers.blogspot.com/2011/03/memory-analysis-for-android.html]

Sobre los sufijos de las carpetas
http://developer.android.com/guide/practices/screens_support.html#qualifiers

Sobre el límites para el tamaño de una aplicación en el Android Market
http://android-developers.blogspot.com/2010/12/android-market-client-update.html

Fuente de Noticias:
Google Docs para Android
http://googledocs.blogspot.com/2011/04/introducing-new-google-docs-app-for.html

Nvidia anuncia procesadores tegra 3 (Procesadores de 4 nucleos)
http://www.tuandroid.com/nuevos-nvidia-tegra-3-muy-pronto/

Sony lanza android tablets
http://andromeno.com/2011/04/sony-s1-y-s2-las-nuevas-tablets-de-sony/

Android-logger

Me tope por ahi con esta aplicación bastante útil a mi parecer. Simplemente permite leer los logs (los que se obtendría usando la utilidad logcat del SDK de Android), filtrarlos e inclusive, enviarlos por correo o salvarlos en un archivo.

http://code.google.com/p/android-logger/

Lo estamos usando en un proyecto en Schematic, y permite que usuarios no “techies” nos envíen los logs en caso de algún crash de la aplicación. Como la aplicación está aun en “beta”, y por lo tanto no disponible en el Android Market, se hacía difícil poder dar soporte en caso de errores de la aplicación.

Andriod en Google IO 2010

Ayer recién llegaba de la extraordinaria conferencia Google IO 2010. Definitivamente fuimos muy afortunados los que tuvimos el privilegio de asistir, y no sólo por los dos teléfonos que nos regalaron: Un Motorola Droid (Verizon) y un HTC Evo 4g (Sprint), sino también por la cantidad de información que recibimos, así como los anuncios sobre lo que tiene Google para este año, como el Google TV y Android 2.2 (FroYo).

Mi interés en esta conferencia se centra particulamente en el tema de Android, ya que por ahora es en lo que me quiero enfocar y por lo tanto será el tema principal de este post, si quieren tener información más detallada de lo demás que se habló en esta conferencia, no duden de visitar la pagina principal de la conferencia aquí. Por aquí me encontré el Live Blog de Endgadget del Keynote del Segundo día.

Lo más destacable de la conferencia, en cuanto a android fue el gran anuncio de la más reciente actualización llamada FroYo, cuya versión numérica es 2.2 ( y para el SDK versión 8). Adjunto aquí un resumen de las características:

  1. Compilador Just-in-Time (JIT) que incrementara la velocidad del sistema de 2x a 5x.
  2. Alrededor de 20 características empresariales, incluyendo una mejor integración con Exchange, un API para  administración del dispositivo (por ejemplo políticas de seguridad), respaldo de datos personales para transferirlos a otro dispositivo android.
  3. Nuevo API para mensajería Cloud-to-Device, algo más allá de notificaciones push.
  4. WiFi tethering y WiFi HotSpot. Esto permitirá que dispositivos con capacidad WiFi puedan conectarse al dispositivo Android y poder acceder a Internet a través de él (usando la conexión de datos del servicio móvil).
  5. Además, actualización al Android Market para poder buscar mejor las aplicaciones. Android Market también podrá ser accedido mendiante una computadora. Pero aun mejor usted podrá bajar la aplicaciónes a su PC  e instalarlas inmediatamente a su dispositivo Android de su elección, sin ocupar conectar el Andriod a su PC (ambos ocupan conexión de datos a Internet).
  6. Es importante recalcar que Google TV soportará aplicaciones Android y estará integrado igualmente con Android Market, por lo que la funcionalidad anterior también estará disponible para Google TV.

Durante el resto de los días estas fueron las charlas relacionadas a Android:

A beginner’s guide to Android Si usted no sabía mucho sobre android y quiere aprender esta era la charla introductoria.
Writing real-time games for Android redux Excelente charla sobre recomendaciones y mejores prácticas para iniciarse en el desarrollo de juegos para Android.
The world of ListView Como sacarle el mejor provecho a este componente visual, mejores prácticas para poder mostrar adecuadamente el contenido en él y además cuando se debe utilizar un ListView y cuando un Scroll View.
Casting a wide net: how to target all Android devices Tal vez una de los requerimientos más importantes a la hora de desarrollar para Android. Debido a la independencia entre Android y los fabricantes de dispositivos móviles, la fragmentación en Android es compleja pero resulta una ventaja para el usuario ya quue puede escoger el dispositivo de acuerdo a sus necesidades. El reto está para los desarrolladores afrontar la fragmentación no como un problema sino como un “feature” más a la hora de diseñar y crear aplicaciones. Durante la charla se dieron bastantes tips sobre como lograr abarcar la mayor cantidad de pantallas, resoluciones y densidades. Espero poder profundizar en este tema en próximos post.
Android UI design patterns Una charla muy clara sobre las mejores prácticas y patrones a la hora de diseñar interfaces para android. Si bien se podría decir que esto está más orientado para diseñadores y expertos en UX, es un tema importante que los desarrolladores serios deben comprender.
Developing Android REST client applications
A JIT Compiler for Android’s Dalvik VM Muy buena reseña sobre como el compilador JIT, que estará disponible a partir de FroYo, mejorará el desempeño del sistema y de las aplicaciónes. Se explicó los métodos para optimizar las aplicaciones, ventajas y desventajas.
Writing zippy Android apps Muy buena charla de mejores prácticas para desarrollar en Android en general.
Advanced Android audio techniques
Building push applications for Android
Fireside chat with the Android team
Fireside chat with Android handset manufacturers
Analyzing and monetizing your Android & iPhone apps

También me parece importante rescatar la actividad que hubo el Miércoles después de las charlas, de verdad una actividad para socializar muy interesante y entretenida.

Aquí termina mi resumen de Android en Google IO 2010. No quise hacer un post muy largo, para motivarlos a buscar información detallada en el sitio de Google y otro montón de fuentes disponibles en la Web.

Espero volver el próximo año y seguir trabajando en aplicaciones para Android, y tal vez algún día llegar como expositor u orador.