勉強会資料out ofmemory
DESCRIPTION
Androidでよくバグる BitmapがらみのOutOfMemoryについての資料です。TRANSCRIPT
HelloOut of Memory
ナオシムTwitter @naosim_Blog http://naosim.syoyu.net/
背景
・ Android はメモリ不足で良く落ちる・その時出るエラーが Out of Memory・原因のほとんどが画像がらみ・一眼レフの画像とかマジやばい
Out of Memory で落ちないように勉強しておきま
しょう。
どうすると落ちる?
・必要以上にデカイ画像を読み込む・使い終わったのに解放しない
→ 意図的に「解放しないようにする」ヤツはいない。
ただ、いつのまにか。。。知らない間に。。。実は。。。
Out of Memory 対策① 画像ファイルの読み込み– サイズを小さくする
→ BitmapFactory.Options– 画質を落とす
→ BitmapConfig
② 終了時– 画像を捨てる宣言をする
→ bmp.recycle();– 参照を null にする
→ drw.setCallback(null); mContext = null;
サイズ小
低画質
null
ポイ
素画像
1.Read
2.Finish
サイズを落とす
原寸大 (1200x800) サムネイル (120x80)
アプリで使うサイズ
Android における画像の取り扱い http://lablog.lanche.jp/archives/192
BitmapFactory.Options でサイズを落とす
小さく 取得
情報だけ取得
倍率セット
Bitmap.Config で画質を落とす
通常は 8 ビット
おすすめ 565
Bmp.recycle(); で解放宣言
GC 対象になり易くする
参照を null にする
これをやらないとActivity が解放されないかもしれない。
Activity が消えない例// ダメなプログラムDrawable mDrawable;@OverridePublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);ImageView imageView = new ImageView(this);if(mDrawable == null) {
mDrawable = this.getResources().getDrawable(R.drawable.hoge);}imageView.setImageDrawable(mDrawable);setContentView(imageView);
}
Activity(Context)
ImageView
Drawable
Activity からの参照が消えても
ImageView からの参照が残るので、
Activity が消えない
実は内部でmDrawable.setCallback(i
mageView) になってる!
Drw.setCallback(null);Drawable mDrawable;@OverridePublic void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);ImageView imageView = new ImageView(this);if(mDrawable == null) {
mDrawable = this.getResources().getDrawable(R.drawable.hoge);}imageView.setImageDrawable(mDrawable);setContentView(imageView);
}
// 解放する@OverridePublic void onStop() {
super.onStop();mDrawable.setCallback(null);
}
mContext に気をつけろ• あなたの作ったクラスで Context を扱う必
要がある場合– できるだけメンバ変数では持たないようにす
る– onStop とかで mContext = null; をする
まとめ• いつの間にか無駄な読み込みがされない
ように気をつけよう。• mContext を持つのは若干危険だから気を
つけよう。
時間があったら読むといいよー• Android4.0 のソース– https://github.com/naosim/android-15/
• ImageView– https://github.com/naosim/android-15/blob/mast
er/android/widget/ImageView.java– 351 行 , 597 行
• Button– https://github.com/naosim/android-15/blob/mast
er/android/widget/Button.java