勉強会資料out ofmemory

16
Hello Out of Memory ナナナナ Twitter @naosim_ Blog http://naosim.syoyu.net/

Upload: nao-fujita

Post on 19-Jun-2015

1.390 views

Category:

Technology


0 download

DESCRIPTION

Androidでよくバグる BitmapがらみのOutOfMemoryについての資料です。

TRANSCRIPT

Page 1: 勉強会資料Out ofmemory

HelloOut of Memory

ナオシムTwitter @naosim_Blog http://naosim.syoyu.net/

Page 2: 勉強会資料Out ofmemory

背景

・ Android はメモリ不足で良く落ちる・その時出るエラーが Out of Memory・原因のほとんどが画像がらみ・一眼レフの画像とかマジやばい

Page 3: 勉強会資料Out ofmemory

Out of Memory で落ちないように勉強しておきま

しょう。

Page 4: 勉強会資料Out ofmemory

どうすると落ちる?

・必要以上にデカイ画像を読み込む・使い終わったのに解放しない

→ 意図的に「解放しないようにする」ヤツはいない。

Page 5: 勉強会資料Out ofmemory

ただ、いつのまにか。。。知らない間に。。。実は。。。

Page 6: 勉強会資料Out ofmemory

Out of Memory 対策① 画像ファイルの読み込み– サイズを小さくする

→ BitmapFactory.Options– 画質を落とす

→ BitmapConfig

② 終了時– 画像を捨てる宣言をする

→ bmp.recycle();– 参照を null にする

→ drw.setCallback(null); mContext = null;

サイズ小

低画質

null

ポイ

素画像

1.Read

2.Finish

Page 7: 勉強会資料Out ofmemory

サイズを落とす

原寸大 (1200x800) サムネイル (120x80)

アプリで使うサイズ

Android における画像の取り扱い  http://lablog.lanche.jp/archives/192

Page 8: 勉強会資料Out ofmemory

BitmapFactory.Options でサイズを落とす

小さく 取得

情報だけ取得

倍率セット

Page 9: 勉強会資料Out ofmemory

Bitmap.Config で画質を落とす

通常は 8 ビット

おすすめ 565

Page 10: 勉強会資料Out ofmemory

Bmp.recycle(); で解放宣言

GC 対象になり易くする

Page 11: 勉強会資料Out ofmemory

参照を null にする

これをやらないとActivity が解放されないかもしれない。

Page 12: 勉強会資料Out ofmemory

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) になってる!

Page 13: 勉強会資料Out ofmemory

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);

}

Page 14: 勉強会資料Out ofmemory

mContext に気をつけろ• あなたの作ったクラスで Context を扱う必

要がある場合– できるだけメンバ変数では持たないようにす

る– onStop とかで mContext = null; をする

Page 15: 勉強会資料Out ofmemory

まとめ• いつの間にか無駄な読み込みがされない

ように気をつけよう。• mContext を持つのは若干危険だから気を

つけよう。

Page 16: 勉強会資料Out ofmemory

時間があったら読むといいよー• 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