android - 滑动 Java.lang.IllegalStateException : Cannot obtain size for recycled Bitmap: android. graphics.Bitmap@a4f3bcf[896x157] ARGB_8888

标签 android kotlin android-glide

我有一个带有一些背景的回收者 View 的 Activity 。

有时当滚动 recyclerview 并按下后退按钮时,我会收到此错误。

我有两种背景(一种是模糊的)。

要加载我使用的普通背景:

fun AppCompatImageView.loadImage(resId: Int) {
    Glide.with(context)
            .load(AppCompatResources.getDrawable(context, resId))
            .into(this)
}

要加载我使用的模糊背景:

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)

有什么想法吗?

最佳答案

确保你的代码中没有像下面这样的语句:

Glide.with(getApplicationContext()).clear(target);
Glide.get(getApplicationContext()).getBitmapPool().clearMemory();

从文档中,getBitmapPool() 返回用于临时存储 {@link android.graphics.Bitmap 的 {@link com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool} } 以便它们可以被重用以避免垃圾收集。

通常,当任何位图回收发生时,特别是当位图已经被回收时,就会发生此错误。因此,如果 getBitmapPool() 需要更好地包装在 if 中,请检查 !bitmap.isRecycled()

关于android - 滑动 Java.lang.IllegalStateException : Cannot obtain size for recycled Bitmap: android. graphics.Bitmap@a4f3bcf[896x157] ARGB_8888,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49738855/

相关文章:

android - 如何让进度条显示

android - Firebase isEmailVerified 无法正常工作 kotlin android

Android Glide 不会从 url 加载 .jpg

android - multiDexKeepFile 不工作

java - 无法在 Eclipse 上启动 Activity componentInfo

kotlin - 为什么Rx会打印整个数组而不是每个项目

android - Koin 安卓 : org. koin.error.NoBeanDefFoundException

android - RecyclerView 或 ListView 的 Jetpack Compose 是什么?

java - Glide 不更新相同 url 的图像 android?

android - GIF 图片加载缓慢问题