viernes, 3 de junio de 2016

Bases de Datos en Android, aumentando la velocidad de las inserciones.

La pantalla de inicio de una una aplicación Android estaba demasiado lenta en el arranque, porque descargaba unos 900 sitios en la base de datos SQLite al comenzar la activad. Yo estaba haciendo una gran cantidad de inserciones SQL, con el propósito de llenar una tabla para poder tener la información disponible de manera offline. Buscando una solución encontré por internet el uso de transacciones explícitas en SQLite para aumentar la velocidad de la inserción en la tabla.

La lista que estaba insertando en la tabla contenía 900 sitios, que debían ser insertados en la base de datos, para después ser ubicados en el mapa. y el tiempo que tomaba era de 16 segundos. Este era mi código inicial:


public void createSites(List<Site> objs) {
    for (Site obj : objs) {
        ContentValues values = obj.getContentValues();
        long insertId = db.insertWithOnConflict(database.TABLE_TYPEPENDING,null,values,SQLiteDatabase.CONFLICT_REPLACE);
    }
}

Después de añadir transacciones explícitas en SQLite, el tiempo paso a menos de un segundo, y la información estaba disponible mucho más rápido.

public void createSites(List objs) {
    try {
        //Inicio la transacción
        db.beginTransaction();
        for (Site obj : objs) {
            ContentValues values = obj.getContentValues();
            db.insertWithOnConflict(database.TABLE_TYPEPENDING, null, values, SQLiteDatabase.CONFLICT_REPLACE);
        }
        //Marca la transacción actual como exitosa
        db.setTransactionSuccessful();
    }catch (SQLException e) {
        Log.e(toString(),"Sql error");
    } finally {
        //Termina la transacción
        db.endTransaction();
    }
}

sábado, 5 de marzo de 2016

Como conectar a Android con ADB sobre TCP?

Desde una computadora, si tienes el USB conectado

La forma más sencilla de conectarse mediante WIFI al teléfono, es si ya tienes el teléfono conectado a la pc con USB. Desde una linea de comandos en la computadora, tienes que escribir los siguientes comandos:

adb tcpip 5555
adb connect <IP Telefono>:5555

Asegurate de reemplazar correctamente la ip del telefono que actualmente tiene tu dispositivo.

Descubrir la ip manualmente:

Ve a la configuracion wifi de android, click en el boton de menu en la barra de aciones, as click en avanzado y mira la ip al final de la pantalla.




Usar adb, para descubrir la IP:

Ejecuta los siguientes comandos por adb

adb shell ip -f inet addr show wlan0
To tell the ADB daemon return to listening over USB
adb usb

Proceso manual, desde el telefono (SI el telefono esta rooteado)

Tu puedes habilitar la conexión ADB sobre WIFI desde el dispositivo si tu telefono esta rooteado.

su
setprop service.adb.tcp.port 5555
stop adbd
start adbd


Lo puedes desabilitar con los siguientes comandos:

setprop service.adb.tcp.port -1
stop adbd
start adbd

viernes, 18 de diciembre de 2015

Packt Publishing todos los libros a 5$

A partir del 17 de diciembre 2015 en el Año Nuevo, Packt Publishing está invitando a todo el mundo de la tecnología para explorar su extensa biblioteca de libros electrónicos y vídeo cursos por un precio increíble. Cada eBook y Vídeo que Packtpub ha creado alguna vez estará disponible por sólo $ 5!

miércoles, 30 de septiembre de 2015

Packt's PacktLib subscription Campaign

http://bit.ly/1YLFu4z


This week, Packt Publishing has reduced the price of its PacktLib subscription service. For just $100 a year you have access to every single book in Packt’s huge library of over 3,000 strong eBooks and videos, especially the latest releases that are available as soon as they’re published.

All you have to do is set up a subscription here to get access to the whole service for a full year. Customers are also encouraged to check out the reader for free, which lets them see every book they already own laid out for easy viewing

domingo, 26 de julio de 2015

Packtpub Skill Up Survey Results!



Last month, Packt asked you to take the Skill Up survey to get a greater understanding of the tech world. Over 20,000 of tech professionals responded, leading to the biggest developer salary and skills survey of 2015!

Check out the results of this survey and discover what everyone thinks will be the next big thing in tech and what skills the biggest earners in your sector have under their belt.

At Packt we’re committed to helping the world put software to work in new ways and have launched a whole range of exclusive offers to help you to Skill Up:
  1. Every eBook and Video is now available for $10! Check out our Top 20 here.
  2. Grab some great course bundles - 5 for $25 on every Video and eBook based on your most essential skills.
  3. PacktLib with over 3000 titles in our library at a reduced rate of $80 for a limited time.

Discover what you need to know to be the best. It’s time to Skill Up!

martes, 23 de junio de 2015

Joomla cargar un modulo dentro de un componente

Dejo una función para cargar un modulo dentro de un componente en joomla, despues nada más tienes que invocarla con el nombre de la posición y listo.

function load_module_position( $position, $style = 'xhtml')
{
   switch($style)
   {
      case 'table':
         $style = 1;
         break;
      case 'horz':
         $style = 1;
         break;
      case 'none':
         $style = -1;
         break;
      case 'xhtml':
         $style = -2;
         break;
      case 'rounded':
         $style = -3;
         break;
      default:
         $style = -2;
         break;
   }

   $document   = &JFactory::getDocument();
   $renderer   = $document->loadRenderer('module');
   $params      = array('style'=>$style);

   $contents = '';
   foreach (JModuleHelper::getModules($position) as $mod)  {
      $contents .= $renderer->render($mod, $params);
   }
   return $contents;
}

domingo, 5 de abril de 2015

Ciclos de Vida de una Actividad en Android

Las Activity, en Android son el objecto principal de cualquier aplicación. Y cuando un usuario utiliza una aplicación puede entrar a la aplicación, cambiar de actividad, salir de ella, volver a entrar, etc. Entender el ciclo de vida de una aplicación es un proceso VITAL para poder crear aplicaciones Android de calidad.


Una aplicación Android corre dentro de su propio proceso Linux. Este proceso es creado con la aplicación y continuará vivo hasta que ya no sea requerido y el sistema reclame su memoria para asignársela a otra aplicación.  Una característica importante de Android es que la destrucción del proceso de la aplicación no es controlado por la aplicación, en lugar de eso, es el sistema que determina en que momento detener el proceso, basándose en el conocimiento que tiene de las partes de la aplicación que están corriendo (actividades y servicios), y cuánta memoria disponible hay en un determinado momento.

Si una aplicación es eliminada y después es vuelta a abrir se crea un nuevo proceso, pero se habrá perdido el estado que tenia esta aplicación. En estos casos, va a ser responsabilidad del programador almacenar el estado de las actividades, si queremos que cuando sea reiniciada conserve su estado.



Dependiendo de la complejidad de la aplicación no usar todos los metodos del ciclo de vida. Pero de todas maneras es importante entender cada uno e implementar esos que aseguren un correcto funcionamiento de la aplicación. Hacer eso requiere estar seguros que la aplicación no fallar en los siguientes casos:

  • No va a dar error cuando el usuario reciba una llamada o cambie a otra aplicación.
  • No va a consumir recursos importantes del sistema mientras el usuario no la este usando. 
  • No va a perder el progreso del usuario mientras deje la aplicación y vuelva.
  • No va a dar error o perder el progreso de la aplicación si el usuario cambia la orientación del telefono.
Estos son los estados descritos en la gráfica y lo que significa cada uno de ellos:

  • Activa (Resumed): En este estado la actividad esta en primer plano y el usuario puede interactuar completamente con ella.
  • Visible (Paused): En este estado la actividad esta parcialmente oscurecida por otra actividad, La activadad que este en primer plano es semitransparente o no cubre la pantalla completa. Una actividad pausada es visible pero no recibe interacciones con el usuario.
  • Parada (Stopped): En este estado la aplicación esta completamente oculta y no es visible al usuario, se considera que esta en el background. Aquí se debe almacenar el estado actual de la aplicación, interfaz, preferencias, etc...
  • Destruida (Destroyed): Cuando la actividad termina al invocarse el método finish(), o es destruida por el sistema.

Cada vez que una actividad cambia de estado se generan eventos que podrán ser capturados por  métodos de la actividad. A continuación dichos métodos:

  • onCreate(Bundle): se dispara cuando la actividad es iniciada y se usa para realizar todo tipo de inicializaciones, como la creación de la interfaz de usuario o la inicialización de estructuras de datos. Puede recibir información sobre el estatus de la actividad o recibir el intent enviado por otra aplicación. 
  • onStart(): se dispara cuando la actividad está a punto de ser mostrada al usuario.
  • onResume(): se dispara cuando la actividad esta disponible al usuario y va a interactuar con ella.
  • onPause(): se dispara cuando otra actividad pasa a primer plano y esta pasa a estar en un segundo plano. 
  • onStop():  se dispara cuando la actividad ya no es visible para el usuario. Lo siguiente que puede dispararse seria onRestart o onDestroy o nada. dependiendo de lo que haga el usuario. 
  • onRestart(): se dispara cuando la actividad va a volver a ser representada después de haber pasado por onStop().
  • onDestroy(): sucede cuando se esta limpiando la información de la aplicación antes de ser completamente destruida la aplicación. Puede suceder cuando la actividad es finalizada con finish(), o porque el sistema este destruyendo la instancia de la aplicación para guardar espacio.

    NOTA: Este metodo no debe ser contado para guardar la información del usuario. porque puede suceder que se finalice la aplicación sin llamar a este metodo. 
Documentación oficial: