Header image

Noticias android

¿Cómo optimizar una listview en Android?

A la hora de personalizar una ListView en Android con más componentes que un simple texto o imágenes almacenadas en el dispositivo, entran en juego otros factores que en su mayoría afectan a la experiencia de usuario y a la gestión de memoria del dispositivo.

Partiremos de una sencilla ListView cuyos items serán una ImageView y una TextView. A continuación detallo el layout para los elementos de la lista:

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent" >

<ImageView
android:id="@+id/image"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_margin="5dp" />

<TextView
android:id="@+id/text"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceMedium" />

</LinearLayout>

Una primera optimización nos permite descargar imágenes de internet de manera que el hilo de ejecución principal (en el que se toma en cuenta la interacción del usuario) no se vea afectado. Así, el scroll de la ListView es suave y no espera a que las imágenes se hayan descargado para permitir los eventos de usuario. Siguiendo los pasos que comenta Gilles Debunne en el blog de Android Developers, dispondremos de una clase utilitaria para descargar imágenes y asignarlas a una ImageView por medio de una AsyncTask. Además podemos añadir un sencilla caché para las imágenes descargadas recientemente, de manera que no tengamos que descargarlas siempre.

Esta primera optimización presenta un problema a partir de un número considerable de elementos en la lista, puesto que genera mucho tráfico de datos y en scrolls rápidos lanza demasiadas AsyncTask, por lo que el rendimiento decae considerablemente e incluso provoca excepciones por el número de tareas lanzadas. Nuestra segunda optimización va dirigida al adaptador de la lista, más concretamente a su método getView(int position, View convertView, ViewGroup parent). Crearemos un adaptador eficiente que reutilice las vistas de sus elementos y así se reduzca su número sin colapsar la memoria a base de objetos. Esto lo haremos reasignando la vista que nos viene como parámetro en el método getView(). Además, utilizamos una clase estática auxiliar que contendrá nuestras ImageView y TextView, lo que reduce significativamente el número de llamadas al método findViewById(int id),  costoso en tiempo.

Así quedaría nuestro adaptador, junto con la clase auxiliar:

public View getView(int position, View convertView, ViewGroup parent) {

ViewHolder holder;
if (convertView == null) {

convertView = inflater.inflate(R.layout.list_item, parent, false);
holder = new ViewHolder();
holder.image = (ImageView)convertView.findViewById(R.id.image);
holder.text = (TextView)convertView.findViewById(R.id.text);
convertView.setTag(holder);

else holder = (ViewHolder) convertView.getTag();

imagesDownloader.download("La url de la imagen", holder.image);
holder.text.setText("Nuestro texto");

return convertView;

}

static class ViewHolder {

public ImageView image;
public TextView text;

}

Con esta optimización salvamos problemas de memoria importantes, así como evitamos que se lancen AsyncTask por cada elemento de la lista al hacer un scroll muy rápido, ya que los elementos de la lista se van reciclando conforme entran/salen de la porción de lista que vemos en pantalla.

Por último, aprovecharemos el ScrollListener que se puede asignar a toda ListView para evitar poner a descargar imágenes mientras hacemos scroll, por tanto sólo cuando la lista esté detenida descargará las imágenes de sus elementos de internet. De esta manera ganamos en eficiencia, lo que tiene una repercusión directa en la interacción del usuario con la lista. Es interesante aprovechar que nuestra clase de utilidad para descargar imágenes en segundo plano nos permite asignar una imagen por defecto, que se mostrará mientras dure el proceso de carga de la imagen real, y que utilizaremos mientras la lista no esté detenida. La Activity que aloje nuestra lista deberá implementar por tanto OnScrollListener, cuyos métodos son:

public void onScroll(AbsListView view, int firstVisibleItem,
int visibleItemCount, int totalItemCount) {

}

public void onScrollStateChanged(AbsListView view, int scrollState) {

switch (scrollState) {

case OnScrollListener.SCROLL_STATE_IDLE:
mBusy = false;
mAdapter.notifyDataSetChanged();
break;
case OnScrollListener.SCROLL_STATE_TOUCH_SCROLL:
mBusy = true;
break;
case OnScrollListener.SCROLL_STATE_FLING:
mBusy = true;
break;

}

}

Con el flag mBusy controlamos la imagen que se va a mostrar en nuestra lista a través del método getView() de la siguiente forma:

if (!mBusy) {

imagesDownloader.download("La url de la imagen", holder.image);

} else holder.image.setImageResource("La imagen por defecto");

Con esta serie de optimizaciones tendremos listas de objetos que pueden extenderse tanto como quieran sin introducir problemas en la interacción del usuario y manteniendo el uso de memoria muy ajustado, lo que favorecerá la impresión que causen nuestras aplicaciones Android.

Para todos aquellos que piensan que el desarrollo de videojuegos para móviles no es un negocio rentable, que vayan y se lo comenten a los directivos de Square Enix.

Gracias al aumento en ventas netas de su creciente negocio de juegos de móviles, Square Enix ha vuelto a ser rentable.

De acuerdo con los resultados más recientes de la compañía correspondientes al ejercicio fiscal que terminó el 31 de marzo de 2012, las ventas netas subieron un 2,1 por ciento a 127,8 millones de yenes, lo que supuso 6.06 millones de yenes de ingresos netos. Es un cambio significativo para la compañía, ya que el año pasado reporto un perdida neta cercana a los 12,04 millones de yenes.

Square Enix no es la única que ha visto potenciado su negocio gracias a su división móvil. La semana pasada, su rival Capcom informó de su ingreso debido a la división de juegos para móviles aumentó 76,4 por ciento, a $ 28,9 millones durante el año fiscal, ayudando a compensar las bajas ventas de otras divisiones.

La compañía pronostica que sus ventas netas llegarán a 165 millones de yenes ($ 2.06 mil millones) en el año fiscal que termina el 31 de marzo de 2013, con un ingreso neto de 9 millones de yenes ($112.7 millones).

App Center de Facebook

Llevaba ya un tiempo Facebook actuando de forma más o menos incomprensible, pero después del pasado 9 de Mayo y el anuncio de su flamante App Center muchas de estas acciones han cobrado sentido repentinamente. Ahora se entiende el por qué de la eliminación de las páginas de Facebook para aplicaciones, las nuevas plantillas para los perfiles de Facebook, su inminente salida a bolsa, la compra de Instagram, etc.. Todo huele a que la gente de Facebook está apostando por el boom de las apps para smartphones.

App Center de Facebook

Facebook anunción su app center el pasado 9 de Mayo

Un gran número de las apps más populares de los diferentes markets se apoyan, en mayor o menor medida, en Facebook. Con esta apuesta Facebook pretende reunir todas estas apps bajo un mismo market dando facilidades tanto a desarrolladores como a usuarios de esta plataforma. Lo que todavía no queda claro es si habrá firmado un pacto de no agresión con los markets más populares como el App Store de Apple o el Google Play.

El App Center englobará todas las posibles aplicaciones de Facebook: canvas, web y móviles.

El App Center englobará todas las posibles aplicaciones de Facebook: canvas, web y móviles.

Facebook ya ha abierto su API para que los primeros programadores comiencen a desarrollar para el App Center. Es una gran oportunidad para llegar fácilmente a 900 millones de usuarios potenciales. Desde la compañía ya han anunciado que darán más visibilidad a las app más valoradas por los usuarios. Teniendo en cuenta todo esto es fácil prever una revolución en cuanto al posicionamiento de apps se refiere… pero ya veremos qué ocurre cuando por fin  abran el market al público.

 

Bienvenido a nuestro Blog. Esperamos que sea también tuyo así que no dudes en comentar y opinar

Vamos a traerte todas las noticias del sector y también lo que vayamos haciendo a nuestros clientes y aprendiendo nosotros.

Te esperamos en el próximo post!

Follow

Get every new post on this blog delivered to your Inbox.

Join 7 other followers:

Or subscribe to the RSS feed by clicking on the counter:

Startcapps Feedburner