Собственная ошибка при получении растрового изображения из ресурса - PullRequest
0 голосов
/ 24 января 2019

У меня родной сбой:

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 голосов
/ 24 января 2019

После нескольких часов расследования я исправил проблему.Кажется, проблема в том, что в метод одновременно входило более одной сопрограммы.Я использовал 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
    }
   }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...