bumptech / bumptech/glide

IllegalStateException: Cannot obtain size for recycled Bitmap

Open
#4,511 3 comments 0 reactions 0 assignees View on GitHub
Dominant language
Java
Stars
35k
Forks
6.2k
Avg merge
1d 11h
Merged PRs (30d)
8

Description

**Glide Version**: 4.11.0

**Device/Android Version**: All devices.

**Stack trace / LogCat**:
```ruby
Caused by: java.lang.IllegalStateException: Cannot obtain size for recycled Bitmap: android.graphics.Bitmap@34aeaf5[720x1560] ARGB_8888
at com.bumptech.glide.util.Util.getBitmapByteSize(Util.java:79)
at com.bumptech.glide.load.resource.bitmap.BitmapResource.getSize(BitmapResource.java:52)
at com.bumptech.glide.load.engine.LockedResource.getSize(LockedResource.java:81)
at com.bumptech.glide.load.engine.LockedResource.getSize(LockedResource.java:81)
at com.bumptech.glide.load.engine.EngineResource.getSize(EngineResource.java:62)
at com.bumptech.glide.load.engine.cache.LruResourceCache.getSize(LruResourceCache.java:40)
at com.bumptech.glide.load.engine.cache.LruResourceCache.getSize(LruResourceCache.java:11)
at com.bumptech.glide.util.LruCache.put(LruCache.java:117)
at com.bumptech.glide.load.engine.cache.LruResourceCache.put(LruResourceCache.java:11)
at com.bumptech.glide.load.engine.Engine.onResourceReleased(Engine.java:396)
at com.bumptech.glide.load.engine.EngineResource.release(EngineResource.java:116)
at com.bumptech.glide.load.engine.Engine.release(Engine.java:362)
at com.bumptech.glide.request.SingleRequest.clear(SingleRequest.java:326)
at com.bumptech.glide.manager.RequestTracker.clearAndRemove(RequestTracker.java:72)
at com.bumptech.glide.RequestManager.untrack(RequestManager.java:663)
at com.bumptech.glide.RequestManager.untrackOrDelegate(RequestManager.java:631)
at com.bumptech.glide.RequestManager.clear(RequestManager.java:627)
at com.bumptech.glide.RequestManager.onDestroy(RequestManager.java:374)
at com.bumptech.glide.manager.ActivityFragmentLifecycle.onDestroy(ActivityFragmentLifecycle.java:65)
at com.bumptech.glide.manager.SupportRequestManagerFragment.onDestroy(SupportRequestManagerFragment.java:215)
at androidx.fragment.app.Fragment.performDestroy(Fragment.java:2927)
at androidx.fragment.app.FragmentStateManager.destroy(FragmentStateManager.java:482)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1294)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1354)
at androidx.fragment.app.FragmentManager.moveFragmentToExpectedState(FragmentManager.java:1432)
at androidx.fragment.app.FragmentManager.moveToState(FragmentManager.java:1495)
at androidx.fragment.app.FragmentManager.dispatchStateChange(FragmentManager.java:2617)
at androidx.fragment.app.FragmentManager.dispatchDestroy(FragmentManager.java:2601)
at androidx.fragment.app.FragmentController.dispatchDestroy(FragmentController.java:330)
at androidx.fragment.app.FragmentActivity.onDestroy(FragmentActivity.java:365)
at androidx.appcompat.app.AppCompatActivity.onDestroy(AppCompatActivity.java:242)
```

Here is small demo:

startActivityA:
```ruby
class ActivityA: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_test)
tv.text = javaClass.name
tv.setOnClickListener {
val intent = Intent(this, ActivityB::class.java)
startActivity(intent)
}
}
}
```
Here is ActivityB:
```ruby
class ActivityB : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_test)
tv.text = javaClass.name
tv.setOnClickListener {
val intent = Intent(this, ActivityC::class.java)
startActivity(intent)
finish()
}
Glide.with(this).asBitmap().load("a picture url")
.into(object : CustomTarget() {
override fun onResourceReady(resource: Bitmap, transition: Transition?) {
val bitmap = Bitmap.createBitmap(resource, 0, 0, resource.width / 2, resource.height / 2)
resource.recycle() // notice!
img.setImageBitmap(bitmap)
}

override fun onLoadCleared(placeholder: Drawable?) {

}
})
}
}
```
Here is ActivityC:
```ruby
class ActivityC: AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.layout_test)
tv.text = javaClass.name
}
}
```
When you click on 'tv' in ActivityB, then you'll find the bug.

Since we didn't use the original image, we should recycle it, shouldn't we?

Contributor guide

Open the contributing guide

Assessment

This issue has not been assessed yet.

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.