web-dev-qa-db-fra.com

Glide image chargement avec contexte d'application

J'utilise Glide pour le chargement d'images dans mon Android application, afin d'éviter tout blocage. Je charge des images avec un contexte d'application. Quel en sera l'effet sur les performances de l'application et de la mémoire?

53
HariRam

Quel sera l'effet de ceci sur les performances de l'application et de la mémoire?

Glide fournit autant de méthodes .with() pour une raison: il suit le cycle de vie.

Imaginez un Fragment ajouté dynamiquement à une activité. Dans sa méthode onCreateView, il lance un chargement Glide d’une image de 3 Mo. Maintenant, que se passe-t-il si l'utilisateur appuie sur le bouton Précédent et que le fragment est supprimé ou que toute l'activité est fermée?

  • Si vous utilisez with(getActivity().getApplicationContext()), rien ne se passera, tous les 3 Mo de données sont téléchargés, puis décodés, mis en cache, probablement même sur ImageView, qui est ensuite mis au rebut, car la seule référence à ces données provient des éléments internes de Glide.
  • Si vous utilisez with((Fragment)this) Glide souscrit aux événements du cycle de vie du fragment et dès que le fragment est arrêté, la requête en attente doit être suspendue. et une fois détruites, toutes les demandes en attente seront effacées. Cela signifie que le téléchargement des images s’arrêtera à mi-parcours et que ce fragment mort n’utilisera plus de ressources.
  • Si vous utilisez with(getActivity()), Glide s'abonne aux événements du cycle de vie de l'activité et la même chose se produit comme ci-dessus, mais uniquement lorsque l'activité est arrêtée ou détruite.

La meilleure pratique consiste donc à utiliser le contexte/fragment le plus proche possible pour éviter les requêtes inutilisées! (Il existe également un moyen manuel d’arrêter une charge: Glide.clear(ImageView|Target).)


Pour appliquer cela en pratique, essayez d'utiliser with(this) lorsque cela est possible, mais si ce n'est pas le cas, comme dans un adaptateur ou une méthode de chargement d'image centralisée, transmettez un RequestManager glide comme argument et utilise glide.load(..., par exemple:

static loadImage(RequestManager glide, String url, ImageView view) {
    glide.load(url).into(view);
}

ou en adaptateur:

class MyAdapter extends WhichEveryOneYouUse {
    private final RequestManager glide;
    MyAdapter(RequestManager glide, ...) {
        this.glide = glide;
        ...
    }
    void getView/onBindViewHolder(... int position) {
        // ... holder magic, and get current item for position
        glide.load... or even loadImage(glide, item.url, holder.image);
    }
}

et utilisez-les de l'activité/fragment:

loadImage(Glide.with(this), url, findViewById(R.id.image));
// or
list.setAdapter(new MyAdapter(Glide.with(this), data));
203
TWiStErRob