Open mafanwei opened 3 years ago
You cannot safely call recycle() on a resource.
I wouldn't recommend copying the Bitmap either, I'm not sure what exactly the goal is. That said I don't think it's related to the error.
Here is my goal:
class GlideCropWithRadioTransformation(private val radio: Float) : BitmapTransformation() {
companion object {
private val VERSION = 1
private val ID = "com.xxx.utils.GlideCropWithRadioTransformation.$VERSION"
}
override fun transform(pool: BitmapPool, toTransform: Bitmap, outWidth: Int, outHeight: Int): Bitmap {
val srcRadio = toTransform.width.toFloat() / toTransform.height.toFloat()
val destWidth: Int
val destHeight: Int
return when {
srcRadio == radio -> {
toTransform
}
srcRadio < radio -> {
destWidth = toTransform.width
destHeight = (destWidth / radio).toInt()
Bitmap.createBitmap(toTransform, 0, (toTransform.height - destHeight) / 2, destWidth, destHeight)
}
else -> {
destHeight = toTransform.height
destWidth = (destHeight * radio).toInt()
Bitmap.createBitmap(toTransform, (toTransform.width - destWidth) / 2, 0, destWidth, destHeight)
}
}
}
override fun toString(): String {
return "GlideCropWithRadioTransformation($radio)"
}
override fun equals(other: Any?): Boolean {
return other is GlideCropWithRadioTransformation && other.radio == radio
}
override fun hashCode(): Int {
return ID.hashCode() + radio.hashCode()
}
override fun updateDiskCacheKey(messageDigest: MessageDigest) {
messageDigest.update((ID + radio).toByteArray(CHARSET))
}
}
Is there anything that can be improved?
Are there other more efficient ways to avoid using Bitmap.createBitmap()? @sjudd
Glide Version: 4.11.0
Device/Android Version: All devices.
Stack trace / LogCat:
Here is small demo:
startActivityA:
Here is ActivityB:
Here is ActivityC:
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?