Androidで大容量データをImageViewに読み込む場合、OutOfMemoryが発生する事がある。
もちろん通常のjavaでも大容量データを扱う場合同様の事が発生する可能性があるわけでして…
Androidの場合はそれが顕著になっている様子。(上限や設定値などは未調査)
ひとまずその解決法をアップ。

やる事は『画像をリサンプリング(再標本化)する』という事。
リサンプリングについてはここには詳しく記載しません。
(というより記載できません。詳しくは知らないので…汗)

雰囲気を感じ取れる程度のソースを以下に記載。

===========================================================================

// ①画像情報のみ取得
InputStream iStream = context.getContentResolver().openInputStream(uri);
BitmapFactory.Options opt = new BitmapFactory.Options();
opt.inJustDecodeBounds = true;
Bitmap bmp = iBitmapFactory.decodeStream(iStream, null, opt);
iStream.close();
iStream = null;

// ②取得した画像情報からリサンプル値を取得(変換後サイズを300とする)
int resample = 1 + (opt.outWidth/300);

// ③画像をリサンプリング
iStream = context.getContentResolver().openInputStream(uri);
opt.inSampleSize = resample;
opt.inJustDecodeBounds = false;
bmp = BitmapFactory.decodeStream(iStream, null, opt);

===========================================================================

ポイントは上記ソース内のコメントの通りで全3工程で行う事。
①まずはリサンプル値を求めるために、画像情報を読み込む。
②その後、読みん込んだ値からリサンプル値を算出。
 ※上記例では実際の画像とリサンプル後の横幅の比率より値を算出しているが
  必要であれば縦の比率も取得可能。
③最終的に算出したリサンプル値で画像を変換する。


こんな感じグッド!
職場の知り合いがよく食べに行くラーメン屋があると言うことで
同じプロジェクトのメンバー3人で『伝丸』にいって来ました。

ネットで見る限りただのチェーン店
まぁでも食べてみないとわからないビックリマーク
と言うことで行って来ましたにひひ

photo:01



先に感想を言ってしまうとまぁフツーかな?
と言った感じ。
でも、オフィスのそばに美味しいラーメン屋がないため
オフィスまわりで言えば一番安定グッド!

ちなみに注文したラーメンは
お店オススメの『味噌バターコーンラーメン』ラーメン
一緒に行った人が『黒味噌ラーメン』なるものを食べていた

スープを一口もらったところ、自分が食べたラーメンより
美味しかったかも…

次に昼飯を食べに行く機会があれば
黒味噌にしよ~
意外と落とし穴が多い。
今回わかった注意しなければならない点を列挙爆弾

1. ソフトウェアキーボードを考慮する
 ソフトウェアキーボードは画面を"押し上げて"出てくるわけではない。
 そのため、ScrollViewを実装してないと画面にかぶってしまう。
  ⇒ テキストエリアが画面下方にある場合は入力している文字列が確認できない状況に陥ってしまう

 たとえば以下のようなレイアウトの画面があった場合、
 ソフトウェアキーボードが出現するとEditText3が隠れてしまう。
 $springmanODのブログ

 こんな感じ。
$springmanODのブログ

 これを回避するには全体をScrollView内に設置する。


2. 画面回転を考慮する①
 画面回転時、画面した半分が画面外に隠れてしまい、入力不可な状態に陥る。
 こちらについても解決方法はScrollView内に設置する事で解決可能。


3. 画面回転を考慮する②
 画面回転をすると、設定した画像が消えてしまう。
 どうやら、画面回転のタイミングでActivityが一度破棄(onDestroy)され再度生成(onCreate)されるらしい。
 その際、一部のコンポーネントを除いてデータが破棄されてしまう。そのため当現象が発生。
 
 解決方法は以下2つ
  ①onSaveInstanceState、onRestoreInstanceStateを使用してデータを保存/復帰する
  ②onRetainNonConfigurationInstance、ongetLastNonConfigurationInstanceを使用してデータを保存/復帰する

 基本的には①を使用するが、①は保存できるデータ型がBundleクラスに保存可能な型に限られている。
 ②はなんでも保存できるが、メモリリークを発生させる可能性を含んでいる。

 ※Bundleクラスに保存可能な型
  基本型もしくは、Parcelableを実装したクラス。

まぁこんなもんかな目