web-dev-qa-db-fra.com

Précharger plusieurs images avec Glide

Nous essayons de précharger les images dans la mémoire cache pour les charger plus tard (les images sont situées dans le dossier Asset de l'application)

Ce que nous avons essayé:

Glide.with(this)
    .load(pictureUri)
    .diskCacheStrategy(DiskCacheStrategy.ALL);

Glide.with(this)
    .load(picture_uri)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .preload();

Le problème: les images ne sont mises en cache que lorsque nous essayons de les charger/les afficher: elles doivent être chargées en mémoire avant afin qu'elles apparaissent plus rapidement.

Glide.with(this)
    .load(picture_uri)
    .into(imageView);

Nous avons également essayé d'utiliser un GlideModule pour augmenter la taille de CacheMemory:

public class GlideModule implements com.bumptech.glide.module.GlideModule {
    @Override
    public void applyOptions(Context context, GlideBuilder
        builder.setMemoryCache(new LruResourceCache(100000));
    }

    @Override
    public void registerComponents(Context context, Glide glide) {
    }
}

Dans le manifeste:

 <meta-data Android:name=".GlideModule" Android:value="GlideModule"/>

Jusqu'à présent, rien ne fonctionne. Une idée?


Nous essayons d'utiliser une imageView 1 dp invisible, mais le résultat est le même:

for(Drawing drawing: getDrawingsForTab(tab)){

    Glide.with(this)
            .load(drawing.getImage().toUri())
            .dontAnimate()
            .diskCacheStrategy(DiskCacheStrategy.ALL)
            .into(mPreloadCacheIv);

    for(Picture picture : getPictures()){

        Glide.with(this)
                .load(picture.getPicture().toUri())
                .dontAnimate()
                .diskCacheStrategy(DiskCacheStrategy.ALL)
                .into(mPreloadCacheIv);
    }
}
28
An-droid

La meilleure option est de gérer vous-même la mise en cache, cela vous donne plus de contrôle et devrait être facile car vous savez déjà quels bitmaps doivent être chargés.

Premièrement: configurer un LruCache

LruCache<String, Bitmap> memCache = new LruCache<>(size) {
    @Override
    protected int sizeOf(String key, Bitmap image) {
        return image.getByteCount()/1024;
    }
};

Deuxièmement: chargez les bitmaps dans le LruCache

Display display = getWindowManager().getDefaultDisplay();
Point size = new Point();
display.getSize(size);
int width = size.x; //width of screen in pixels
int height = size.y;//height of screen in pixels
Glide.with(context)
    .load(Uri.parse("file:///Android_asset/imagefile"))
    .asBitmap()
    .fitCenter() //fits given dimensions maintaining ratio
    .into(new SimpleTarget(width,height) {
        // the constructor SimpleTarget() without (width, height) can also be used.
        // as suggested by, An-droid in the comments
        @Override
        public void onResourceReady(Bitmap resource, GlideAnimation glideAnimation) {
            memCache.put("imagefile", resource);
        }
    });

Troisièmement: utilisez les bitmaps mis en cache

Bitmap image = memCache.get("imagefile");
if (image != null) {
    //Bitmap exists in cache.
    imageView.setImageBitmap(image); 
} else {
    //Bitmap not found in cache reload it 
    Glide.with(context)
         .load(Uri.parse("file:///Android_asset/imagefile"))
         .into(imageView);
}
18
Sakchham

Utilisez le code suivant pour mettre en cache les images sans les afficher

  1. en utilisant la méthode downloadOnly si vous cherchez à télécharger des images à partir du Web et à les stocker dans le diskCache:

    FutureTarget<File> future = Glide.with(applicationContext)
        .load(yourUrl)
        .downloadOnly(500, 500);
    
  2. en utilisant la méthode preload si vous souhaitez les charger dans le cache mémoire.

    Glide.with(context)
            .load(url)
            .preload(500, 500);
    

Vous pouvez ensuite utiliser les images mises en cache à l'aide de

Glide.with(yourFragment)
    .load(yourUrl)
    .into(yourView);

21
Vinay Wadhwa

Glide version 4.6.1

RequestOptions requestOptions = RequestOptions
        .diskCacheStrategy(DiskCacheStrategy.ALL);

Glide.with(appContext)
        .asBitmap()
        .load(model)
        .apply(requestOptions)
        .submit();
10
yoAlex5