Reputation: 2124
I have an activity with a recycler view with some backgrounds.
Sometimes when scroll the recyclerview and press back button I get this error.
I have two types of background(one is blurred).
To load the normal background I use:
fun AppCompatImageView.loadImage(resId: Int) {
Glide.with(context)
.load(AppCompatResources.getDrawable(context, resId))
.into(this)
}
To load the blurred background I use:
Glide.with(mContext)
.applyDefaultRequestOptions(RequestOptions().override(backgroundWidth, backgroundHeight))
.asBitmap()
.load(R.drawable.card_dog_placeholder)
.into(object : SimpleTarget<Bitmap>() {
override fun onResourceReady(bitmap: Bitmap, transition: Transition<in Bitmap>?) {
cardYouAreHeroBackgroundImageView.setImageBitmap(bitmap.blurRenderScript(mContext, CARD_BG_RADIUS))
}
})
fun Bitmap.blurRenderScript(context: Context, radius: Float): Bitmap {
val rs = RenderScript.create(context)
val blurredBitmap = copy(Bitmap.Config.ARGB_8888, true)
val input = Allocation.createFromBitmap(rs, blurredBitmap, Allocation.MipmapControl.MIPMAP_FULL, Allocation.USAGE_SHARED)
val output = Allocation.createTyped(rs, input.type)
val script = ScriptIntrinsicBlur.create(rs, Element.U8_4(rs))
script.setInput(input)
script.setRadius(radius)
script.forEach(output)
output.copyTo(blurredBitmap)
return blurredBitmap
}
java.lang.RuntimeException: Unable to destroy activity {com.yourpackage/com.yourpackage.DashboardActivity}: java.lang.IllegalStateException: Cannot obtain size for recycled Bitmap: android.graphics.Bitmap@a4f3bcf[896x157] ARGB_8888 at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4383) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4401) at android.app.ActivityThread.-wrap5(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1649) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807) Caused by: java.lang.IllegalStateException: Cannot obtain size for recycled Bitmap: android.graphics.Bitmap@a4f3bcf[896x157] ARGB_8888 at com.bumptech.glide.util.Util.getBitmapByteSize(Util.java:78) at com.bumptech.glide.load.resource.bitmap.UnitBitmapDecoder$NonOwnedBitmapResource.getSize(UnitBitmapDecoder.java:49) at com.bumptech.glide.load.engine.EngineResource.getSize(EngineResource.java:60) at com.bumptech.glide.load.engine.cache.LruResourceCache.getSize(LruResourceCache.java:42) at com.bumptech.glide.load.engine.cache.LruResourceCache.getSize(LruResourceCache.java:13) at com.bumptech.glide.util.LruCache.put(LruCache.java:124) at com.bumptech.glide.load.engine.cache.LruResourceCache.put(LruResourceCache.java:13) at com.bumptech.glide.load.engine.Engine.onResourceReleased(Engine.java:326) at com.bumptech.glide.load.engine.EngineResource.release(EngineResource.java:112) at com.bumptech.glide.load.engine.Engine.release(Engine.java:286) at com.bumptech.glide.request.SingleRequest.releaseResource(SingleRequest.java:345) at com.bumptech.glide.request.SingleRequest.clear(SingleRequest.java:324) at com.bumptech.glide.manager.RequestTracker.clearRemoveAndMaybeRecycle(RequestTracker.java:73) at com.bumptech.glide.manager.RequestTracker.clearRemoveAndRecycle(RequestTracker.java:60) at com.bumptech.glide.RequestManager.untrack(RequestManager.java:623) at com.bumptech.glide.RequestManager.untrackOrDelegate(RequestManager.java:591) at com.bumptech.glide.RequestManager.clear(RequestManager.java:579) at com.bumptech.glide.RequestManager.onDestroy(RequestManager.java:323) at com.bumptech.glide.manager.ActivityFragmentLifecycle.onDestroy(ActivityFragmentLifecycle.java:65) at com.bumptech.glide.manager.SupportRequestManagerFragment.onDestroy(SupportRequestManagerFragment.java:194) at android.support.v4.app.Fragment.performDestroy(Fragment.java:2585) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1559) at android.support.v4.app.FragmentManagerImpl.moveFragmentToExpectedState(FragmentManager.java:1752) at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1821) at android.support.v4.app.FragmentManagerImpl.dispatchStateChange(FragmentManager.java:3251) at android.support.v4.app.FragmentManagerImpl.dispatchDestroy(FragmentManager.java:3242) at android.support.v4.app.FragmentController.dispatchDestroy(FragmentController.java:265) at android.support.v4.app.FragmentActivity.onDestroy(FragmentActivity.java:390) at android.support.v7.app.AppCompatActivity.onDestroy(AppCompatActivity.java:209) at android.app.Activity.performDestroy(Activity.java:7208) at android.app.Instrumentation.callActivityOnDestroy(Instrumentation.java:1249) at android.app.ActivityThread.performDestroyActivity(ActivityThread.java:4370) at android.app.ActivityThread.handleDestroyActivity(ActivityThread.java:4401) at android.app.ActivityThread.-wrap5(Unknown Source:0) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1649) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loop(Looper.java:164) at android.app.ActivityThread.main(ActivityThread.java:6494) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:438) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:807)
Any idea?
Upvotes: 2
Views: 2883
Reputation: 3209
Make sure there are no statements like below in your code :
Glide.with(getApplicationContext()).clear(target);
Glide.get(getApplicationContext()).getBitmapPool().clearMemory();
From docs, getBitmapPool() returns the {@link com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool}
used to temporarily store {@link android.graphics.Bitmap}
so they can be reused to avoid garbage collections.
Usually this error happens when any bitmap recycling happens specially when the bitmap is already recycled. So in case getBitmapPool()
is needed better to wrap inside a if
check !bitmap.isRecycled()
Upvotes: 1