我本机崩溃:
A/libc: invalid address or address of corrupt block 0x55766f1b00 passed to try_realloc_chunk
A/libc: Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdeadbaad in tid 32219 (onPool-worker-1)
使用以下方法执行drawable.draw(canvas)
行时:
fun getBitmapFromResource(context: Context, imageRes: Int, iconSize: Float = CATEGORY_ICON_SIZE): Bitmap? {
val drawable = ContextCompat.getDrawable(context, imageRes)
if (drawable is BitmapDrawable) {
return drawable.bitmap
}
val size = GraphicsUtils.toPx(context, iconSize)
val bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
drawable!!.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas) // crash!!
return bitmap
}
drawable是VectorDrawable
的实现。我在协程中的后台线程上执行此代码。
我将vectorDrawables.useSupportLibrary = true
添加到了build.gradle
文件中,但是没有帮助。
我需要位图对象,因为根据其宽度和高度,我绘制了一个自定义图表,并且需要在其中执行尺寸计算。
我怀疑多线程可能会破坏该过程,因此我在runBlocking
部分(仍在后台线程中)中添加了此代码-无效。
有什么办法解决这个问题吗?
答案 0 :(得分:1)
经过几个小时的调查,我解决了这个问题。
问题似乎是同时有多个协程进入该方法。我使用Mutex
确保该方法中只能包含一个协程。
object UIUtilsSingleton {
private val mutex = Mutex()
suspend fun getBitmapFromResource(context: Context, imageRes: Int): Bitmap? {
var bitmap: Bitmap? = null
mutex.withLock {
val iconSize = 42f
val drawable = ContextCompat.getDrawable(context, imageRes)
if (drawable is BitmapDrawable) {
return drawable.bitmap
}
val size = GraphicsUtils.toPx(context, iconSize)
bitmap = Bitmap.createBitmap(size, size, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
drawable!!.setBounds(0, 0, canvas.width, canvas.height)
drawable.draw(canvas)
}
return bitmap
}
}