visor y carga asíncrona

Configuré un visor en mi proyecto que desplaza las imágenes. Estoy alimentando las imágenes del visor desde un fragmento administrado por un adaptador. Las imágenes están almacenadas, provienen de una de mis carpetas dibujables o provienen de una URL. He estado usando Volley de Android junto con un caché de memoria para adquirir las imágenes de la red (URL). Mi código para completar el fragmento es el siguiente:

// case for no xml url's downloaded
if (url == null) {
    ImageView image = new ImageView(getSherlockActivity());
    image.setImageResource(imageResourceId);
    image.setScaleType(ScaleType.FIT_XY);

    layout.addView(image);
} else {

    // use volley NetworkImageView
    NetworkImageView image = new  NetworkImageView(getSherlockActivity());
    image.setImageUrl(url, ImageCacheManager.getInstance().getImageLoader());
    image.setScaleType(ScaleType.FIT_XY);

    layout.addView(image);
}

Descubrí que el desplazamiento de la imagen es lento en cualquier caso y sospecho que el problema es cargar en la cola principal. ¿Debería usar el "Universal Image Loader" en lugar de Volley? He visto el divertido ejemplo de mapa de bits de Android, pero me preocupa la complejidad y su capacidad para manejar URL y dibujables.

Gracias de antemano por su ayuda.

preguntado el 15 de febrero de 14 a las 20:02

1 Respuestas

@Override
public Object instantiateItem( View pager, final int position )
{

//Some other work related to instantiation of item    

 AsyncTask<Uri, Void, Bitmap> mLoadTask = new AsyncTask<Uri, Void, Bitmap>() {              
 //async task for loading images in background

    @Override
    protected void onPostExecute(Bitmap result) {
        pageview[position].setImageBitmap(result);                                         
        //post in ui thread
        //this way you have a reference object for each item(using position)
        //and hence you can start several tasks at the same time             
    }

    @Override
    protected Bitmap doInBackground(Uri... params) {        
        Bitmap bitmap=getBitmap(params[0]);    
        //here getBitmap returns the bitmap using uri arguement
        return bitmap;
    }

};
mLoadTask.execute(Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, "" + image_id));
}

Esto creará un nuevo hilo para cada View por lo tanto, el subproceso principal de la interfaz de usuario se ejecutará sin problemas.

Respondido 16 Feb 14, 18:02

Gracias por la respuesta. Su respuesta asume que las imágenes están almacenadas en el almacén de medios del proveedor de contenido de Android. En mi caso, tengo direcciones URL que se utilizan para extraer las imágenes de un servidor. Además, existe la posibilidad de que la vista ya haya desaparecido cuando onPostExecute se ejecuta a medida que el buscapersonas de la vista recorre las vistas. Supongo que la mejor manera es una caché de memoria/disco. - Jack120

@ Jack120 Esta es solo una demostración de la implementación de tareas asíncronas. Estoy seguro de que puede hacer las modificaciones necesarias para hacerlo para cualquier propósito que desee. En segundo lugar, el pageview[position] asegura que una referencia única está disponible durante onPostExecute usando el position variable. Entonces, incluso si se sale del alcance, no se encuentra con ningún problema. - Shakti

Entiendo. Pero todavía necesito obtener el mapa de bits en la memoria caché para futuras cargas. - Jack120

github.com/thest1/LazyList Esto se encargará de todas sus necesidades, carga diferida, almacenamiento en caché en la tarjeta SD y en la memoria. También usa inSampleSize para reducir la memoria utilizada. - Shakti

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.