導入:画像読み込み最適化は「入れて終わり」じゃない
Androidアプリで画像を扱うなら、Glide や Coil を使うのは当たり前ですよね。
ただし、「ライブラリを入れた=最適化完了」だと思っていると、確実に痛い目を見ます。
- スクロール時に画像がチラつく
- 大量表示で OOM(OutOfMemoryError)が出る
- 表示が遅く、UXが悪化する
これらはすべて 画像読み込み設計の問題 です。
この記事では、Android上級者向けに、
Glide / Coil を使った画像読み込み最適化を「OOM・チラつき・遅延」すべてまとめて対策します。
先に結論です。
- OOMは「Bitmapサイズ」と「キャッシュ設計」で防げる
- チラつきは View 再利用と Placeholder でほぼ消える
- 遅延はプリフェッチと優先度設計が9割
Glide と Coil の思想の違いを理解する
最適化の前に、まず両者の思想を整理します。
Glide
- BitmapPool による強力なメモリ再利用
- Transformation・キャッシュ戦略が豊富
- 長年の実績と安定性
Coil
- Kotlin / Coroutines 前提の設計
- シンプルで拡張しやすい
- Compose との相性が良い
どちらが優れている、ではなく
「どう最適化するか」が重要です。
最適化① OOM対策(最重要)
OOMの原因はほぼ次のどれかです。
- 必要以上に大きな Bitmap を生成している
- Bitmap が解放されていない
- キャッシュがメモリを圧迫している
Glide:サイズ指定を必ず行う
Glide.with(context)
.load(url)
.override(imageView.width, imageView.height)
.into(imageView)
サイズ指定なしでの読み込みは、
OOM一直線です。
Coil:Viewサイズに合わせる
imageView.load(url) {
size(ViewSizeResolver(imageView))
}
Glide のメモリ使用量を下げる
Glide.get(context).setMemoryCategory(MemoryCategory.LOW)
大量画像画面では、これだけで安定性が変わります。
最適化② キャッシュ戦略
キャッシュは「速くする」だけでなく、
OOMを防ぐ役割も持っています。
Glide の DiskCacheStrategy
.diskCacheStrategy(DiskCacheStrategy.AUTOMATIC)
Coil のキャッシュ設定
imageView.load(url) {
memoryCachePolicy(CachePolicy.ENABLED)
diskCachePolicy(CachePolicy.ENABLED)
}
リスト表示で毎回ネットワークに行っているなら、
キャッシュ設定が間違っています。
最適化③ チラつき対策
RecyclerView でのチラつきは UX を一気に壊します。
Placeholder は必須
.placeholder(R.drawable.placeholder)
.error(R.drawable.error)
View再利用時のクリア
override fun onViewRecycled(holder: ViewHolder) {
Glide.with(holder.itemView).clear(holder.imageView)
}
これを入れないと、
前の画像が一瞬表示される現象が出ます。
最適化④ 遅延対策(プリフェッチ)
Glide のプリフェッチ
Glide.with(context)
.load(nextImageUrl)
.preload()
Coil のプリフェッチ
imageLoader.enqueue(
ImageRequest.Builder(context)
.data(nextImageUrl)
.build()
)
スクロールが速い画面では、
プリフェッチなし=遅延確定です。
アニメーション画像(GIF)の注意点
GIFはメモリ消費が激しく、OOMの原因になります。
可能であれば WebP へ移行しましょう。
詳しくは以下の記事で解説しています。
パフォーマンス計測を必ず行う
最適化は「体感」ではなく、
Profilerで確認してください。
- Memory Profiler
- Frame drops
- GC頻度
よくある失敗
- サイズ指定なしで画像読み込み
- View再利用を考慮していない
- キャッシュを無効化している
まとめ
- 画像最適化は設計の問題
- OOM・チラつき・遅延はすべて対策できる
- Profilerで可視化するのが最短ルート
迷ったら:画像サイズを疑う。
それだけで9割の問題は解決します。


コメント