Reputation: 365
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
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
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