Thursday, February 19, 2015

Android Media Player se congela al llamar al Método release.

Pues la semana pasada me reportaron un BUG muy extraño en la que el UI se congelaba, simplemente estaba tocando un video y PUM! Esto sucedía de manera aleatoria en solo algunos dispositivos, y bueno para no hacerla larga (no vaya a ser que a alguien le guste, jejeje), resulto ser el media player server de android. Resulta que en algunas ocasiones simplemente la llamada a su metodo release() se atora, no mas no regresa. Y si, estoy hablando de android.media.MediaPlayer.
Despues de buscar en internet por alguna solución, lo unico que encontre fue el diagrama de estados, y bueno la recomendación fue checar mi aplicación y revisar que los cambios de estado esten implementados correctamente. He aqui una referencia a tal diagrama.

http://developer.android.com/reference/android/media/MediaPlayer.html

Y bueno no encontré ningun problema en la secuencia de hecho, ni la memoria se ve incrementada de una manera en la que pueda parecer que no se esta liberando, ni el procesador se ve muy cargado, simplemente algunas veces, en algunos dispositivos se congela.

Al final mi solución fue:
Dentro de la clase en la cual utilizo el media player, creo una clase interna que solo me va a servir para llamar al metodo release del media player

    private class ReleaseCheck implements Runnable
    {    
        public CLASE_EN_DONDE_SE_LLAMA_A_RELEASE m_JNIVideoClass;
       
        /**
         *  Default constructor
         *  @param videoClass : The target object in which the MediaPlayer will be monitored.  
         */
        public ReleaseCheck(CLASE_EN_DONDE_SE_LLAMA_A_RELEASE videoClass)
        {
        m_JNIVideoClass = videoClass;
        }
   
        /**
         *  Waits one second, after that it check if the
         *  media server has been released, if not it kills it.  
         */
        public void run() 
        {
   try
   {
       Thread.sleep(1000);
     
       // is the media player still releasing
       if (m_JNIVideoClass.m_Releasing)
       {
           // Kill media player          
       Log.e(TTMActivity.Instance().getTag(), "MediaPlayer : The media server must be killed...");
                    killMediaServer();          
       }          
            }
            catch (Exception e)
   {
   Log.e(TTMActivity.Instance().getTag(), "Error in ReleaseCheck.run() : " + e.getMessage());       
   }
        }    
    }    

Ademas agregue dos metodos, KillMediaPLayer que simplemente le da un Kill al media player, y una verified release que inicia un thread que se encarga deverificar que realmente le media player se haya liberado, de lo contrario, lo apaga, lo mata, KILL!!!.

    /**
     * Stops the process /system/bin/mediaserver which is hanged, this is 
     * intended to avoid the device to get frozen, by media player not
     * returning when calling the release method.  
     **/
    public void killMediaServer()
    {
        try
        {            
            Log.d(TTMActivity.Instance().getTag(), "Killing the media server.");

            if (!SystemUtils.runProtectedCommand(TTMActivity.Instance().getTag() + " : Killing the media server",SU_KILL_COMMAND))
            {
                Log.e(TTMActivity.Instance().getTag(), "Cannot kill media server");
            }
            else
            {
            Log.e(TTMActivity.Instance().getTag(), "media server killed");
            }                                        
        }
        catch (Exception e)
        {
        Log.e(TTMActivity.Instance().getTag(), "Error killing the media server : " + e.getMessage());
        }    
    }

    /**
     * Tries to release the media player for a new video or sound file.
     * It starts a Thread which waits for the release function to end. 
     **/
    protected void verifiedRelease()
    {   
    // set the releasing flag
    m_Releasing = true;    
   
    // Create and start the release wait thread
        Thread t = new Thread(new ReleaseCheck(this));
        t.start();                    

        // Do the media player release
        m_MediaPlayer.release();        
        m_MediaPlayer = null;        
        
        // turn of the release flag
        m_Releasing = false;
    }        

Si alguien encuentra una solución mas elegante para esto, please no tuerza a la banda!

Saludos.


Friday, November 14, 2014

Raphael JS

Algunos comentarios sobre Raphael JS



En algunos proyectos previos he tenido que trabajar con algunas librerías Javascript que permiten explotar el mítico SVG de HTML5..


Data Driven Documents o simplemente d3js

http://d3js.org/

Es una excelente opción, de propósito general, y esa es su gran fortaleza, pues se puede hacer de todo, además hace un perfecto "bind" entre datos y objetos en pantalla. Es definitivamente mi favorito y perfecto para crear charts desde cero, aunque hay mucha base por ahí en github, por eso nunca empieza uno desde cero realmente.

Funciona en todos los navegadores decentes, eso excluye versiones antiguas de Internet Explorer, es decir anteriores a la 9 no funciona,

D3js genera y envía SVG directamente al navegador y realmente IE8 para abajo no entiende SVG,

Aunque hay algunos workarounds para ello no creo que valga la pena hacerlo.

He leido comentarios de que D3js es difícil de aprender, en primera instancia,  pues si, puede ser necesario leer un poco mas si solo vienes de Javascript.

D3js viene lleno de algoritmos ya listos para usar, uno de los mas impresionantes es el Force Layout, basta ver los ejemplos para querer aprender a usarlo de inmediato.

Son fan de d3js y por eso aparece en este artículo dedicado a Raphael JS



Raphael JS

http://raphaeljs.com/

Algo que por un tiempo consideré una curiosidad nada mas, tal vez porque el nombre no es muy atractivo, jaja.
Además no había tenido la necesidad de hacer un UI en Web donde el usuario pudiera crear ciertos objetos gráficos, hacer "drag and drop" con ellos, ver propiedades de cada uno....un UI estilo graficación vectorial, pues.
Pues con Raphael JS fue muy rápido, tiene todas las herramientas para hacerlo.

Raphael JS genera y envía SVG o VML al navegador, esto provoca que también funcione en Internet Explorer 6, 7 y 8....mmmm....si funciona, lo probé, de verdad...si funciona...increíble pero cierto.

Si bien puse d3js antes que Raphael JS, este artículo es mas que nada acerca de Raphael, pero d3js es un excelente punto de referencia.

No creo que sirvan para lo mismo pues Raphael te ayuda más a "dibujar" elementos mientras que d3js te ayuda más a ligar datos con los elementos.

Al final lo que quiero expresar aquí es lo grandioso que Raphael JS es, y en mi caso específico en poco tiempo se pudo lograr el objetivo gracias a esta libreria.

Aquí un pequeño ejemplo


 
// creamos el "paper" o canvas principal, en donde el parámetro "canvas" es un simple
// <div></div> dentro del código html
var paper = new Raphael("canvas", 800, 600);
 
var circle = paper.circle(120, 120, 50).attr({ fill: "#e0e0e0", stroke: "#000", opacity: 1 }),
 
// mas adelante puedes cambiar las propiedades de "circle"
// por ejemplo, cambiar el radio
circle.attr({r: 80 });
 
// o cambiarlo pero con una animacion fancy
 
circle.animate({r:80},500,"elastic");



Conociendo un poco de Javascript y de <svg> se pueden hacer cosas impresionantes. Puedes ver los ejemplos en el link de Raphael JS para darte una idea.

Excelente libreria Javascript


Dificultad: Intermedio

Debes conocer: Javascript, HTML, SVG

Similares:  d3js, paper.js, processing.js

Calificación general: 8 de 10

Lo usaría de nuevo: Definitivamente si



Friday, November 7, 2014

Mundo conectado

Hoy día es  los dispositivos hacen que nuestra vida este en constante verificación de estado.

  • Celular
  • Tablet
  • reloj
  • lap
  • y hasta las tv
nos permiten estar siempre disponibles, conectados y localizables.



Me cagan las tabletas

Porque a la luz del sol simplemente valen camote, porque cuando iniciaron su autonomia en bateria era mayor y ahora se ha reducido, porque ahora son mas frágiles, porque representan un dispositivo mas para poner a cargar tanto en bateria como en portabilidad junto con su cargador y todo el pedo, porque se vuelven obsoletas en un santiamen, porque son sucias como la reputamadre, en dos minutos ya estan todas engrasadas y sucias. Uff!! necesitaba desahogarme jajajajajaj

Newbie con AngularJS

Como sugerencia de un amigo y colega de batallas:

Querido Blog.

Hoy desperté pensando en....que chingaos?...shit

No, ya en serio.

Siempre le he sacado la vuelta a AngularJS, dando preferencia para mi uso personal y profesional a jquery,  porque jquery es muy bueno desde mi punto de vista.

Pero AngularJS se ve muy bien, es más basado en MVC, más cuadrado diria yo, que jquery.

En jquery puedes hacer las cosas como te de la gana, en  AngularJS te alineas al MVC, eso es bueno, es más fácil depurar algo que ya tiene una estructura preconcebida....
Bueno, dejaré luego unos comentarios por aquí de cómo me fué con AngularJS+onsen-ui+cordova


https://angularjs.org/

Problema al generar un APK

Estoy lidiando con un proyecto de android que utiliza el NDK, y tiene referencias a librerias generadas con el SDK y por alguna razón, no esta exportando los archivos .so a /data/data/xxxx/lib. Interesante porque en versiones anteriores si funcionaba.

am start -a android.intent.action.MAIN -c android.intent.category.LAUNCHER -n JabinSoft

Buenos días, hoy iniciamos este BLOG, aqui los miembros de Jabinsoft compartiremos nuestra experiencia en el desarrollo de sistemas, Joderemos el Wero, y seguiremos presionando a Picoro para que regrese a programar...

Aqui vamos...