user232803
user232803

Reputation: 365

Glide issues on re opening + cannot load from destroyed activity

I've been using Glide in adapter where I pass context from Activity class to my fragment(View is in fragment). I've checked in around 30 devices and in 3-5 devices app crashes when the user tries to restart after closing. What could be the reason and how to handle this exception? I don't want to use Applicationcontext in Glide as this will keep the glide resources. Is there any other workaround?

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)

Below code for glide loading

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

Below code for OnBackPressed()

    // ... ...
      ... ..
    finishAffinity();

Upvotes: 3

Views: 2017

Answers (2)

Nilesh Deokar
Nilesh Deokar

Reputation: 2985

Always use the Activity context while loading images using Glide.

And while using Glide with adapters you can pass RequestManager object from activity itself in Constructor of adapter using Glide.with(this).

It is always safe to check whether activity/fragment is visible or not before starting a Glide load.

So for Activity :

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

For 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

Upvotes: 0

Sharath kumar
Sharath kumar

Reputation: 4132

Whenever you are trying to load an image I guess the activity wil be in destroyed state.This happens when you try to load an image and move to different activity before loading.So make a null check to see if still activity exists and also image reference exists.

Also replace itemHolder.ImageView.getContext() with itemHolder.friendImageView.getContext().

Check this edited code for loading image

 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);  
    }

Upvotes: 1

Related Questions