Получение OOM с помощью Glide для установки фона в виде прокрутки - PullRequest
0 голосов
/ 05 октября 2019

В моем приложении около двадцати действий, и при каждом запуске я хотел бы произвольно назначить фоновое изображение родительскому виду (представление с прокруткой), но я постоянно получаю исключение за пределами памяти и пытаюсь нарисоватьслишком большое исключение.

Я переместил фоновые изображения из drawable в drawable-nodpi, реализовал Glide, сжал изображения, установил largeHeap = true, но ошибки не исчезли. Изображения в формате jpg, 270x480 и 36 точек на дюйм. Приведенный ниже метод setBgImage будет вызываться в onStart в базовом действии, и все мои действия расширяют это базовое действие.

Я получаю эти проблемы в предварительном отчете о бета-тестировании на консоли Google Play. Я сам не сталкивался с этой проблемой, используя свой телефон.

SV_parent_layout - это представление прокрутки, к которому я хочу добавить фон. Я не знаю, что еще я могу сделать, чтобы решить эту проблему. Пожалуйста, помогите.

fun AppCompatActivity.setBgImage(drawable: Int, view: View = SV_parent_layout) {
    val bg = decodeSampledBitmapFromResource(resources, drawable, 200, 200)
    Glide.with(this)
        .asBitmap()
        .load(bg)
        .skipMemoryCache(true)
        .diskCacheStrategy(DiskCacheStrategy.NONE)
        .thumbnail(0.8f)
        .fitCenter()
        .into(object: CustomTarget<Bitmap>() {
            override fun onLoadCleared(placeholder: Drawable?) {
            }

            override fun onResourceReady(resource: Bitmap, transition: Transition<in Bitmap>?) {
                view.background = BitmapDrawable(resources, bg)
        }
    })
}

fun calculateInSampleSize(options: BitmapFactory.Options, reqWidth: Int, reqHeight: Int): Int {
    // Raw height and width of image
    val (height: Int, width: Int) = options.run { outHeight to outWidth }
    var inSampleSize = 1

    if (height > reqHeight || width > reqWidth) {

        val halfHeight: Int = height / 2
        val halfWidth: Int = width / 2

        // Calculate the largest inSampleSize value that is a power of 2 and keeps both
        // height and width larger than the requested height and width.
        while (halfHeight / inSampleSize >= reqHeight && halfWidth / inSampleSize >= reqWidth) {
            inSampleSize *= 2
        }
    }

    return inSampleSize
}

fun decodeSampledBitmapFromResource(
    res: Resources,
    resId: Int,
    reqWidth: Int,
    reqHeight: Int
): Bitmap {
    // First decode with inJustDecodeBounds=true to check dimensions
    return BitmapFactory.Options().run {
        inJustDecodeBounds = true
        BitmapFactory.decodeResource(res, resId, this)

        // Calculate inSampleSize
        inSampleSize = calculateInSampleSize(this, reqWidth, reqHeight)

        // Decode bitmap with inSampleSize set
        inJustDecodeBounds = false

        BitmapFactory.decodeResource(res, resId, this)
    }
}
...