从资源获取位图的本机崩溃

时间:2019-01-24 12:00:09

标签: android kotlin bitmap drawable kotlinx.coroutines

我本机崩溃:

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部分(仍在后台线程中)中添加了此代码-无效。

有什么办法解决这个问题吗?

1 个答案:

答案 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
    }
   }