1

J'ai utilisé Glide dans un adaptateur où je transmets le contexte de la classe Activity à mon fragment (View is in fragment). J'ai vérifié environ 30 appareils et dans 3 à 5 appareils se bloque lorsque l'utilisateur essaie de redémarrer après la fermeture. Quelle pourrait être la raison et comment gérer cette exception? Je ne veux pas utiliser Applicationcontext dans Glide car cela permettra de garder les ressources de glissement. Y at-il une autre solution de contournement?Problèmes de glissement lors de la réouverture + impossible de charger à partir de l'activité détruite

Logcat

                java.lang.IllegalArgumentException: You cannot start a load for a destroyed activity 

                     at com.bumptech.glide.manager.RequestManagerRetriever.assertNotDestroyed(RequestManagerRetriever.java:134) 

                     at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:102) 

                     at com.bumptech.glide.manager.RequestManagerRetriever.get(RequestManagerRetriever.java:87) 

                     at com.bumptech.glide.Glide.with(Glide.java:629) 

                     at com.trial.project.Adapter.LiveUserListAdapterInside.onBindViewHolder(LiveUserListAdapterInside.java:68) 

                     at android.support.v7.widget.RecyclerView$Adapter.onBindViewHolder(RecyclerView.java:6356) 

                     at android.support.v7.widget.RecyclerView$Adapter.bindViewHolder(RecyclerView.java:6389) 

                     at android.support.v7.widget.RecyclerView$Recycler.tryBindViewHolderByDeadline(RecyclerView.java:5335) 

                     at android.support.v7.widget.RecyclerView$Recycler.tryGetViewHolderForPositionByDeadline(RecyclerView.java:5598) 

                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5440) 

                     at android.support.v7.widget.RecyclerView$Recycler.getViewForPosition(RecyclerView.java:5436) 

                     at android.support.v7.widget.LinearLayoutManager$LayoutState.next(LinearLayoutManager.java:2224) 

                     at android.support.v7.widget.LinearLayoutManager.layoutChunk(LinearLayoutManager.java:1551) 

                     at android.support.v7.widget.LinearLayoutManager.fill(LinearLayoutManager.java:1511) 

                     at android.support.v7.widget.LinearLayoutManager.onLayoutChildren(LinearLayoutManager.java:595) 

                     at android.support.v7.widget.RecyclerView.dispatchLayoutStep2(RecyclerView.java:3583) 

                     at android.support.v7.widget.RecyclerView.dispatchLayout(RecyclerView.java:3312) 

                     at android.support.v7.widget.RecyclerView.consumePendingUpdateOperations(RecyclerView.java:1618) 

Ci-dessous le code pour le chargement de glisse

Glide.with(itemHolder.ImageView.getContext()).load(current.getPhotoUrl()).bitmapTransform(new CropCircleTransformation(context)) 
        .placeholder(R.drawable.x2) 
        .into(itemHolder.friendImageView); 

Ci-dessous le code pour OnBackPressed()

// ... ... 
    ... .. 
finishAffinity(); 
+0

ajouter logcat s'il vous plaît. –

+0

poster l'erreur que vous obtenez – Anonymous

+0

Malheureusement, je n'ai pas le logcat spécifique de ces appareils et nous ne pouvons pas recréer l'erreur dans nos appareils de test officiels non plus, mais c'était quelque chose comme indiqué ci-dessous et se sont produits dans la ligne de Glide.load ... java.lang.IllegalArgumentException: Vous ne pouvez pas commencer une charge pour une activité détruite – user232803

Répondre

0

Chaque fois que vous essayez de charger une image que je suppose que le wil d'activité être dans un état détruit.Ceci se produit lorsque vous essayez de charger une image et de passer à une activité différente avant e load.So faire une vérification nulle pour voir si l'activité existe encore et aussi la référence de l'image existe.

Remplacez également itemHolder.ImageView.getContext() par itemHolder.friendImageView.getContext().

vérifierons ce code modifié pour l'image de chargement

if(!this.isDestroyed() && friendImageView!=null && current.getPhotoUrl()!=null){ 
     Glide.with(itemHolder.friendImageView.getContext()) 
       .load(current.getPhotoUrl()) 
       .bitmapTransform(new CropCircleTransformation(context)) 
       .placeholder(R.drawable.x2) 
       .into(itemHolder.friendImageView); 
    } 
+0

Je ne suis pas sûr de ce 'itemHolder.ImageView.getContext() avec itemHolder.ImageView.getContext()'. verifiera null si – user232803

+0

désolé c'était friendImageView.The contexte est en train de créer nullPointerexception.Et nous ou utiliser getApplicationContext() ou – Anonymous

+0

Aussi si! this.isDestroying() ne fonctionne pas! this.isFinishing() devrait résoudre votre problème – Anonymous

0

Utilisez toujours les Activity context en chargement des images en utilisant Glide.

Et tout en utilisant Glide avec adapters vous pouvez passer RequestManager objet de l'activité elle-même dans le constructeur de adapter utilisant Glide.with(this).

Il est toujours prudent de vérifier si activity/fragment est visible ou non avant de démarrer une charge de glissement.

Donc, pour l'activité:

if(!this.isFinishing()){ 
    // Initialise Glide here 
} 

Pour Fragment:

MyFragmentClass mFragment = (MyFragmentClass) getSupportFragmentManager().findFragmentByTag("testID"); 
if (mFragment != null && mFragment.isVisible()) { 
    // Initialise Glide here 
} 

Ref: https://android.jlelse.eu/using-glide-few-tips-to-be-a-pro-60f41e29d30a