2010-07-05 15 views
5

He revisado algunas publicaciones sobre la carga lenta pero creo que mi problema es un poco diferente.Android: carga lenta en la Galería

Tengo una galería (mi clase amplía la Galería) que muestra 20 imágenes de gran tamaño (400-500K cada una). No puedo cargarlos todos en la galería ya que recibo una excepción de OutOfMemory.
Así que, creé una matriz de 20 Drawables e inicialmente llené los primeros 9 elementos (las imágenes provienen de la Web) y configuré el resto como nulo. Mi intención era esta: en una aventura a la derecha, busca el elemento no. 10 y establecido en el elemento nulo no. 0. En otro lanzamiento al elemento de búsqueda correcto no. 11 y establecer en el elemento nulo no. 1 a nulo. La misma lógica en una aventura a la izquierda.

El problema es que puedo lanzar mucho más rápido de lo que se recogen los elementos. Mi galería tiene un BaseAdapter y su getView() es como la siguiente:

 
public View getView(int position, View convertView, ViewGroup parent){ 
    ImageView imageView = new ImageView(); 
    imageView.setDrawable(imageArray[position]; 
    .... 
    .... 

    return imageView; 
} 

¿Cómo le digo getView() - si imageArray [posición] sigue siendo nula, muestran una "cargando ..." de diálogo y Una vez que está configurado, ¿te repites con la misma posición?
No quiero ver el imageView vacío y luego configurarlo sobre la marcha. No quiero ver el imageView hasta que esté configurado.

Gracias.

+1

Hay una gran publicación en el blog de Android (así como algún código de ejemplo) que responde a su pregunta: http://android-developers.blogspot.com/2010/07/multithreading-for-performance.html – Ally

Respuesta

6

La galería está diseñada para una experiencia fluida. La interfaz de usuario será muy mala si bloquea la pantalla y no cambia a la siguiente hasta que se recupera. De esta forma el usuario no podrá arrojarse en absoluto. Debería mostrar algún indicador de carga en lugar de la imagen mientras se carga.

Creo que su escenario es bastante común. Deberías descargar imágenes y mostrarlas. Si obtienes OutOfMemory, puedes intentar supersampliar las imágenes Strange out of memory issue while loading an image to a Bitmap object.

Si todavía hay OutOfMemory, debe eliminar mapas de bits de la memoria y almacenarlos en caché en SD. Entonces, cuando el usuario retroceda puede cargar imágenes desde SD nuevamente, será lo suficientemente rápido. Y el consumo de memoria será menor. Como sugiere, puede tener 10 imágenes más recientes almacenadas en la memoria y otras almacenadas en la memoria caché en SD.

Puedes echar un vistazo a mi código de muestra Lazy load of images in ListView. En realidad, es un adaptador ListView, pero puede aplicarlo a la galería con modificaciones menores. Creo que hará exactamente lo que necesita.

+0

Gracias Fedor . Intentará ... – Rob

+0

"Debería mostrar algún indicador de carga en lugar de la imagen mientras se está cargando". ¿Cómo logro esto? Sé cómo colocar un indicador de carga en un registro de progreso delante de la galería, pero ¿cómo coloco el indicador en lugar de la imagen en sí? Solo para recordarle, el imageView se crea en tiempo de ejecución. Si se definió en XML, podría haberle asignado una fuente predeterminada, pero este no es el caso aquí ... gracias. – Rob

+1

No es un problema. Puede crear ProgressControl en tiempo de ejecución en lugar de ImageView. O puede crear ImageView en tiempo de ejecución y visualizar alguna imagen de código mientras se está descargando la imagen real. Expongo la imagen del stub en mi código de muestra. – Fedor