0

Je suis en train de construire une galerie pour mon application. Après quelques tutoriels et stackoverflow, j'ai finalement réussi à faire de la galerie. J'utilise Glide pour définir des images, donc pas de problème de mémoire s'écraser et tout. Le seul problème est, lorsque je lance, les images ne sont pas définies dans leurs vues aussi vite que ces vues sont affichées. Voici un gif. Donc, je peux voir les espaces réservés ou l'arrière-plan du recyclerview pendant que les images sont en train d'être définies. Selon la vitesse de lancement, cela peut durer de 500 à 1000 ms. Mais cela suffit à rendre la galerie mauvaise. Cela se produit lorsque j'utilise Fling pour faire défiler vers le haut ou vers le bas. À ma connaissance, c'est parce que le glide libère les images de son cache. Y a-t-il une solution pour cela? Voici mon code.Glide Cache gestion dans Recyclerview avec mise en page grille

activity_gallery:

<?xml version="1.0" encoding="utf-8"?> 
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
 
    xmlns:tools="http://schemas.android.com/tools" 
 
    android:id="@+id/activity_monuments" 
 
    android:orientation="vertical" 
 
    android:layout_width="match_parent" 
 
    android:layout_height="match_parent" 
 
    tools:context=".GalleryActivity"> 
 

 

 

 
    <android.support.v7.widget.RecyclerView 
 
     android:id="@+id/recyclerview_gallery" 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent" 
 
     android:layout_gravity="center" 
 
     android:alwaysDrawnWithCache="true" 
 
     android:clipToPadding="false" 
 
     android:scrollbars="vertical" 
 
     android:scrollbarStyle="insideOverlay"/> 
 

 
</LinearLayout>

Voici comment je suis en train recyclerview:

RecyclerView gridView = (RecyclerView)findViewById(R.id.recyclerview_gallery); 
 
     gridView.setHasFixedSize(true); 
 
     RecyclerView.LayoutManager layoutManager = new GridLayoutManager(getApplicationContext(),NUM_OF_COLUMNS); 
 
     gridView.setLayoutManager(layoutManager); 
 
     gridView.isDrawingCacheEnabled(); 
 
     gridView.addItemDecoration(new MarginDecoration(GalleryActivity.this, NUM_OF_COLUMNS, GRID_PADDING, true)); 
 
     gridView.setHasFixedSize(true); 
 
     gridView.setVerticalScrollBarEnabled(true); 
 
     gridView.setBackgroundColor(getResources().getColor(R.color.colorBlack)); 
 
     GalleryAdapter galleryAdapter = new GalleryAdapter(GalleryActivity.this, GalleryActivity.this, ImageNamesList, columnWidth); 
 

 
     gridView.setAdapter(galleryAdapter);

Voici comment je suis soi Prép imageview adaptateur:

viewHolder.galleryImage.setLayoutParams(new GridView.LayoutParams(imageWidth, imageWidth)); 
 
     Glide.with(context) 
 
       .load(uri) 
 
       .asBitmap() 
 
       .placeholder(R.drawable.monument) 
 
       .centerCrop() 
 
       .diskCacheStrategy(DiskCacheStrategy.ALL) 
 
       .into(viewHolder.galleryImage);

S'il vous plaît laissez-moi savoir des solutions possibles. P.S.: Le GIF est une vitesse de trame basse et montre donc le fling lent qui n'est pas le cas.

Répondre

0

Pour résoudre la gestion du cache, j'utilise les meilleures pratiques du magasin singleton. Realm pour Android est parfait, il est NoSQL et super rapide, ce que je fais normalement est de créer un objet de domaine, dans l'adaptateur vérifier si l'URL actuelle est dans le domaine, si vrai ne tirez pas une nouvelle image, tirez et stockez.

Ensuite, lorsque l'activité ou le fragment principal est détruit, il vous suffit de tout supprimer du domaine.