Мы применяем растровое изображение всей страницы и хотим избежать ошибок памяти. Что мы пытаемся сделать, так это сравнить размер файла растрового изображения с доступной памятью и либо уменьшить его, либо просто применить.
Вопросы: Будет ли это достигнуто 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
}