Проверка размера диска Bitmap перед применением - PullRequest
0 голосов
/ 27 мая 2020

Мы применяем растровое изображение всей страницы и хотим избежать ошибок памяти. Что мы пытаемся сделать, так это сравнить размер файла растрового изображения с доступной памятью и либо уменьшить его, либо просто применить.

Вопросы: Будет ли это достигнуто sh тем? Есть ли способ лучше?

Вот как мы это делаем (мы тоже новички в Kotlin, поэтому предложения по синтаксису также приветствуются) ->

private suspend fun getFullScreenBitmap(page: MyFullPage): Bitmap? = withContext(Dispatchers.Default) {
        var inputStream: FileInputStream? = null
        val cachedPageFile: File = getFileFromStorage(page)
        var pageImage: Bitmap?
        try {
            inputStream = FileInputStream(cachedPageFile)
            val options = BitmapFactory.Options()
            options.inJustDecodeBounds = true
            BitmapFactory.decodeStream(inputStream, null, options)
            val originalWidth = options.outWidth
            val originalHeight = options.outHeight

            // We will calculate the highest res image
            val displayMetrics = getContext().resources.displayMetrics
            val reqWidth = displayMetrics.widthPixels //imageView.getWidth();
            val reqHeight = displayMetrics.heightPixels //imageView.getHeight();

            //get max heap available to app
            val activityManager = getContext().getSystemService(Context.ACTIVITY_SERVICE) as ActivityManager
            val maxHeap: Int = activityManager.memoryClass //MB

            //get current heap used by app
            val runtime: Runtime = Runtime.getRuntime()
            val usedHeap = ((runtime.totalMemory() - runtime.freeMemory()) / (1024.0f * 1024f)) //MB

            //get amount of free heap remaining for app
            val availableHeap = maxHeap - usedHeap
            val bitmapSize = originalWidth * originalHeight * 4f/1024f * 1024f //MB

            if (bitmapSize > availableHeap) {
                options.inSampleSize = getGoogleSuggestedInSampleSize()
            }
            inputStream.close()

            // Load in actual image
            inputStream = FileInputStream(cachedPageFile)
            options.inJustDecodeBounds = false
            options.inPreferredConfig = Bitmap.Config.RGB_565

            options.inMutable = (FeatureConstants.DEBUG_DOUBLE_TAPS_ENABLED || FeatureConstants.DEBUG_PANELS_ENABLED)

            pageImage = BitmapFactory.decodeStream(inputStream, null, options)

            return@withContext pageImage

        } catch (e: Exception) {
            GravLog.error(TAG, e.toString())
            NewRelic.recordHandledException(e)
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close()
                } catch (e: Exception) {
                    GravLog.error(TAG, e.toString())
                    NewRelic.recordHandledException(e)
                }

            }
        }
        return@withContext null
    }
...