【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()
で再生成してあげる感じです。
- 作者: Dmitry Jemerov,Svetlana Isakova,長澤太郎,藤原聖,山本純平,yy_yank
- 出版社/メーカー: マイナビ出版
- 発売日: 2017/10/31
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る
Kotlinスタートブック -新しいAndroidプログラミング
- 作者: 長澤太郎
- 出版社/メーカー: リックテレコム
- 発売日: 2016/07/13
- メディア: 単行本(ソフトカバー)
- この商品を含むブログ (1件) を見る