Mostrando entradas con la etiqueta java. Mostrar todas las entradas
Mostrando entradas con la etiqueta java. Mostrar todas las entradas

martes, 19 de julio de 2011

Optimización del For (for-each)

Hace tiempo que conozco el for-each y nunca me he parado a pensar qué utilidad podría tener ese for teniendo uno que hace lo que quiero y no necesito ni pensar como usarlo.
En las plataformas móviles parece que es aún más útil usar estas estructuras por lo de ahorrar tiempo de proceso y no gastar bateria.

El for-each puede usarse para colecciones que implementan el interfaz Iterable y para Arrays. Con las colecciones, cada elemento implementa en su interfaz las llamadas a hasNext() y next(). Con un ArrayList, un for escrito a mano es cerca de 3 veces más rápido, y para las colecciones el for-each será exáctamente equivalente al uso del for con los ArrayList.
Ejemplos:

static class Foo {
     int mSplat;
}
Foo[] mArray = ...

public void zero() {
     int sum = 0;
     for (int i = 0; i < mArray.length; ++i) {
         sum += mArray[i].mSplat;
     }
}

public void one() {
    int sum = 0;
    Foo[] localArray = mArray;
    int len = localArray.length;

    for (int i = 0; i < len; ++i) {
        sum += localArray[i].mSplat;
    }
}

public void two() {
    int sum = 0;
    for (Foo a : mArray) {
        sum += a.mSplat;
    }
}

  • zero() es la más lenta porque el JIT no puede optimizar el coste de pedir el tamaño del array cada iteración.
  • one() es más rápida. Guarda todo en variables locales, evitando tener que ir a buscarlas fuera del ámbito de la función. Y optimiza la petición del tamaño del Array.
  • two() es la más rápida para dispositivos sin JIT, y distinguiblemente mejor que la one() para los dispositivos con JIT. Usa el for-each introducido en la versión 1.5 del lenguaje de programación Java.


En definitiva que me tendré que acostumbrar a usar for-each por defecto, salvo excepciones que necesite algo especial en iteraciones con ArrayList.



JIT: Compilador al vuelo de la máquina virtual Dalvik (Just In Time compiler).

Texto original y ejemplos via Use Enhanced For Loop Syntax


sábado, 9 de abril de 2011

Interfaz gráfica y los servicios

Como se hace un Service:

Esta semana hemos visto los servicios en el curso de Android. No me refiero a los aseos, no, me refiero a un tipo de objeto que se ejecuta en background y por definición no tiene interfaz gráfica ni puede modificar nada de ésta.

public class MyService extends Service {   
    @Override
    public IBinder onBind(Intent arg0) {
        // Este sirve para enlazarse con el Manager de Notificaciones
        // para que otros programas usen este servicio.
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        Log.d("MyService", "Arrancando el servicio");
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
       
        Log.d("MyService", "Cerrando el servicio");
    }
}

Como se hace un Interface:

También vimos como hacer que nuestro servicio avisara a nuestras Activities del interfaz gráfico de algún cambio, como por ejemplo en las coordenadas del GPS.
Para el aviso vimos el uso de las interfaces, como esta:

public interface IMyServiceListener {
    public void updateCurrentLocation(Location loc);
}

Una interfaz muy sencilla con un único método a implementar en las clases que la implementen.
En el servicio además hay que añadir un ArrayList, por ejemplo, de Listeners del tipo IMyServiceListener y un par de métodos públicos para poder añadir y quitar elementos del ArrayList.

public static void registerLocationListener(IMyServiceListener listener){
    mArrayListeners.add(listener);
}

public static void unregisterLocationListener(IMyServiceListener listener){
    mArrayListeners.remove(listener);
}

Para implementar la interfaz simplemente sería algo así:

public class AdvancedList extends ListActivity implements IMyServiceListener {
    private Location mLocation;

    @Override
    public void updateCurrentLocation(Location loc) {
       
        mLocation = loc;
        Log.d("UpdatingLocation", loc.toString());
       
        Toast.makeText(this, "New location: " +
                                String.valueOf(loc.getLatitude()) + "-" +
                                String.valueOf(loc.getLongitude()),
                        Toast.LENGTH_LONG);

       
        new getImageTask().execute();
    }

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     
        // Arrancanco el servicio creado.
        startService(new Intent(this, MyService.class));

        // Añado esta clase como listener del servicio, porque
        // implementa la interfaz.
        MyService.registerLocationListener(this);

        myAdapter = new MyAdapter(this);
        setListAdapter(myAdapter);
    }
}

Y cuando desde el servicio se quiera avisar a todos los listeners de algún cambio, podemos crear un método como el siguiente en el servicio y llamarlo cuando se necesite.

private void notifyListeners(){
    Log.d("NotifyListeners",
              "Number of listeners " +
              String.valueOf(mArrayListeners.size()));

    for(int i = 0; i < mArrayListeners.size(); i++){
        mArrayListeners.get(i).updateCurrentLocation(mLocation);
    }
}

Problema:

Bueno, no quería contar toda la clase de ayer pero al final me he liado. Lo que yo quería contar es que aunque implementemos en nuestras Activities la interfaz del listener, cuando el Service llama a ese método de nuestra Activity, la ejecución sigue en la hebra del Service. Por lo cual ni el Toast que he puesto en la implementación del updateCurrentLocation, ni ningún cambio del interfaz gráfico será realizado.

Por suerte no he tardado mucho en darme cuenta jeje, habrá que ver otra forma de avisar desde el servicio si se quiere modificar el interfaz gráfico.

martes, 5 de abril de 2011

Como java.io.Serializable

Bueno, yo poco a poco sigo con mis pequeños descubrimientos, y quiero pensar que a alguien le puede venir bien encontrarse con posts como este, que cuenta cosas que una vez sabidas parecen obvias.

Todo empezó porque un compañero del curso de Android se le ocurrió la brillante idea de serializar un objeto para pasarlo de una Activity a otra por medio de Intent. Y claro, yo quise copiarle.
Como llegué tarde a clase y además no presté atención al profesor (no leas esto Rocapal ;) ), es ahora cuando descubro cómo funciona el interfaz java.io.Serializable.

Mi clase:

public class RestaurantItem implements java.io.Serializable{
    public String mName;
    public String mDescription;
    public int mPicture;
    public Location mLocation;
}

Y después de un rato de darle vueltas he visto que si la clase tiene un atributo de un tipo no básico como "Location" no se va a poder serializar de forma automática.
He probado cambiando el Location por dos doubles:

public double mLatitude;
public double mLongitude;

y funcionaba, pero prefiero no serializar a quitar el Location :p

Por cierto, para quien quiera pasar un objeto serializado en un Intent, simplemente tiene que hacer:

Intent i = new Intent();
i.putExtra("ObjetoName", myObject);

Siendo myObject un objeto de la clase que implementa java.io.Serializable.
Y para recuperar el objeto del Intent, supuestamente en la otra Activity:

ObjSerializable obj = (ObjSerializable) i.getSerializableExtra("ObjetoName");

Y ya está.

domingo, 21 de noviembre de 2010

Cómo preparar Windows para desarrollar con Android

Este post está dirigido a usuarios de Windows que quieran empezar a programar en android. Si tu Sistema Operativo es Ubuntu o cualquier otra distribución basada en Debian, te recomiendo que sigas este otro post.

Android no es un lenguaje de programación, es una agrupación de software para dispositivos móviles que incluye un sistema operativo, software intermédio (middleware) y aplicaciones clave. El SDK de Android proporciona las herramientas y APIs necesarias para comenzar el desarrollo de aplicaciones en la plataforma Android usando el lenguaje de programación Java.

Te guiaré paso a paso para instalar todo lo necesario en tu ordenador.


Paso 1: Java
En el siguiente enlace puedes descargar el JDK.
Recuerda que JDK no es lo mismo que JRE.
Una vez descargado, instalalo como cualquier otra aplicación.


Paso 2: SDK de Android
En el siguiente enlace puedes descargar el SDK de Android.
Una vez en tu equipo, muévelo donde quieras, por ejemplo "C:\" y descomprime el .zip.
Una vez descomprimido, puedes borrar el archivo .zip.
Abre una consola, por ejemplo, pulsando en "Inicio" -> "Ejecutar", teclea "cmd" y pulsa "enter".
Una vez en la consola:
C:\una\carpeta\cualquiera>cd \
C:\>cd android-sdk-windows
C:\android-sdk-windows>tools\android.bat update sdk
Recuerda que sólo hay que ejecutar los comandos en negrita, lo que hay delante de la negrita se llama prompt y no hay que escribirlo.


Paso 3: Eclipse
La versión de Eclipse necesaria para Android debe ser la 3.4 (Ganymede) o 3.5 (Galileo), en la 3.6 (Helios) se han detectado algunos errores.
Sigue el enlace de más abajo, descarga e instala cualquiera de los siguientes Eclipses:
- Eclipse Classic
- Eclipse IDE for Java Developers
- Eclipse IDE for Java EE Developers
Cualquiera te puede valer.


Paso 4: Plugin de Android para Eclipse - ADT Plugin -
Ejecuta Eclipse y ve a "Help" > "Install New Software".
Clic en el botón "Add" para añadir un nuevo sitio. Se abrirá un diálogo, en el campo "Name" escribes por ejemplo "Android Plugin" y en "Location",
Pulsa el botón "Aceptar", esperas a que te salgan cosas en la lista.


Marca todas las casillas para instalar, pulsas "Siguiente", "Siguiente" otra vez, aceptas los términos de la licencia y pulsas "Finalizar".
Una vez haya terminado igual te pide reiniciar el Eclipse.


Paso 5: Configurar Eclipse
En Eclipse, vamos al menú "Window" > "Preferences".
Seleccionamos la sección "Android". En la parte de la derecha tenemos que escribir (o seleccionar) la ruta a la carpeta del SDK de Android, recuerda donde descomprimiste el SDK en el paso 2.


La ventana de preferencias debe parecer a la foto anterior. Guarda los cambios realizados y cierra el diálogo de preferencias.


Listo para usarse
Hemos terminado la instalación.
Si eres principiante te recomiendo empezar leyendo sobre Android y el Framework:
Y algunos ejemplos para aprender lo básico de android:

miércoles, 17 de noviembre de 2010

Cómo preparar Ubuntu para desarrollar con Android

Este post está dirigido a usuarios de Ubuntu, que quieran empezar a programar en android.

Android no es un lenguaje de programación, es una agrupación de software para dispositivos móviles que incluye un sistema operativo, software intermédio (middleware) y aplicaciones clave. El SDK de Android proporciona las herramientas y APIs necesarias para comenzar el desarrollo de aplicaciones en la plataforma Android usando el lenguaje de programación Java.
Te guiaré paso a paso para instalar todo lo necesario en tu Ubuntu.

Nota: si trabajas con linux 64-bit debes instalar las librerías de 32-bit:
user@machine:~$ sudo apt-get install ia32-libs


Paso 1: Java
Desde la consola ejecuta:
user@machine:~$ sudo apt-get install sun-java6-jdk


Paso 2: SDK de Android
En el siguiente enlace puedes descargar el SDK de Android.
Una vez en nuestro equipo, muévelo donde quieras, por ejemplo "/home/tu-usuario/" y descomprime el .tgz:
user@machine:~$ mv Descargas/android-sdk_r07-linux_x86.tgz .
user@machine:~$ tar -xvzf android-sdk_r07-linux_x86.tgz
user@machine:~$ rm android-sdk_r07-linux_x86.tgz
Abre una consola y ejecuta lo siguiente:
user@machine:~$ android-sdk-linux_86/tools/android update sdk


Paso 3: Eclipse
La versión de Eclipse necesaria para Android debe ser la 3.4 o 3.5, en la 3.6 se han detectado algunos errores.
A día de hoy la versión de Eclipse de los repositorios es la 3.5, así que se puede instalar desde consola ejecutando:
user@machine:~$ sudo apt-get install eclipse


Paso 4: Plugin de Android para Eclipse - ADT Plugin -
Ejecuta Eclipse, lo encontrarás en "Aplicaciones" > "Programación" > "Eclipse".
Dentro, ve a "Help" > "Install New Software".
Clic en el botón "Add" para añadir un nuevo sitio. Se abrirá un diálogo, en el campo "Name" escribes por ejemplo "Android Plugin" y en "Location",
Pulsa el botón "Aceptar", esperas a que te salgan cosas en la lista.


Marca todas las casillas para instalar, pulsas "Siguiente", "Siguiente" otra vez, aceptas los términos de la licencia y pulsas "Finalizar".
Una vez haya terminado igual te pide reiniciar el Eclipse.


Paso 5: Configurar Eclipse
En Eclipse, vamos al menú "Window" > "Preferences".
Seleccionamos la sección "Android". En la parte de la derecha tenemos que escribir (o seleccionar) la ruta a la carpeta del SDK de Android, recuerda donde descomprimiste el SDK en el paso 2.


La ventana de preferencias debe parecer a la foto anterior. Guarda los cambios realizados y cierra el diálogo de preferencias.


Listo para usarse
Hemos terminado la instalación.
Si eres principiante te recomiendo empezar leyendo sobre Android y el Framework:
Y algunos ejemplos para aprender lo básico de android:
Related Posts Plugin for WordPress, Blogger...