怠慢プログラマーの備忘録

怠慢でナマケモノなプログラマーの備忘録です。

【Kotlin】OutOfMemoryとの戦い方[備忘録]

アプリ内でイメージを取得して、それをFirebase Cloud Storageに保存しておき適宜取得するようなアプリを作っていましたら、

Failed to allocate a xxxxxx byte allocation with xxxxxx free bytes and 10MB until OOM

のエラーが発生しました。

そうこれがかのOutOfMemoryです。

これには聞き覚えがありました。

なぜなら、

Android でファイルをダウンロードする  |  Firebase

アプリで使用できるメモリよりも大きなファイルをリクエストすると、アプリがクラッシュします。

ご丁寧に書いてありました。 なるべくしてなった感じです。

ただこれはある程度認知していたので、Firebase Cloud Storageから取得する際にはgetBytes()を使用せずgetDownloadUrl()Uriを取得してPicassoで読み込むようにしていてそれで対処したつもりでいたのが大きな間違えでした。

何をするか

対応策は以下の通りです。

  • bitmapを縮小する
  • ImageViewを解放する
  • メンバ変数を殺す

ただ今回のケースでは原因のほとんどがbitmapにありましたので、Firebase Cloud Storageにアップロードする前のImageView内のbitmap自体を縮小することでほぼ解決しました。

val width = bitmap.width / 2
val height = bitmap.height / 2
val resizeBitmap = Bitmap.createScaledBitmap(bitmap, width, height, true)
holder.imageView.setImageBitmap(resizeBitmap)

一部抜粋ですが、Bitmapを生成した後にWidthとHeightを任意を指定してBitmap.createScaledBitmap()で再生成してあげる感じです。

Kotlinイン・アクション

Kotlinイン・アクション

Kotlinスタートブック -新しいAndroidプログラミング

Kotlinスタートブック -新しいAndroidプログラミング