Можно ли обернуть потенциальную ошибку OutOfMemory с помощью try / catch? - PullRequest
0 голосов
/ 09 июля 2019

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

    fun compressImage(filePath: String, sampleRate: Int? = null): Bitmap {
        val options = BitmapFactory.Options().apply {
            inJustDecodeBounds = true
        }
        BitmapFactory.decodeFile(filePath, options)

        val reqSampleRate = sampleRate ?: calculateInSampleSize(options, maxWidth, maxHeight)

        try {
            options.inSampleSize = reqSampleRate
            options.inPreferredConfig = Bitmap.Config.ARGB_8888
            options.inJustDecodeBounds = false
            return BitmapFactory.decodeFile(filePath, options)
        } catch (e: OutOfMemoryError) {
            System.gc()
            // increase sample rate to get smaller bitmap size
            return compressImage(filePath, reqSampleRate + 2)
        }
    }

Это хорошая практика, чтобы обернуть потенциальную OOMс попробовать / поймать?или есть другое решение?

1 Ответ

0 голосов
/ 14 июля 2019

Outofmemoeryerror не является исключением. Это ошибка (Child of Throwable). На мой взгляд, не рекомендуется использовать блоки try / catch для отлова ошибки памяти и восстановления после нее. Даже если используются блоки try / catch, Outofmemoeryerror будет запускаться снова и снова, когда сегмент памяти кучи исчерпан. Вы можете использовать следующие два, чтобы избежать получения Outofmemoererrors

  1. Следуя лучшим рекомендациям по реализации кода
  2. Использование правильных настроек памяти с использованием флагов VM

Для более подробной информации, вы можете проверить этот сайт - https://outofmemoryerror.io/

...