勉強会資料out ofmemory

Post on 19-Jun-2015

1.390 Views

Category:

Technology

0 Downloads

Preview:

Click to see full reader

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

top related