Activityを切り替えずに、動的にListViewを作ったり消したりしていると、ガベージコレクションを何度実行しても回収されず、何故かメモリリークっぽい事になります。

以下再現ソースです。
(さらに…)

Activity(またはView)の状態保存・復元はonSaveInstanceStateとonRestoreInstanceStateとで行われますが、これのテストが困難だったりします。

(ちょっと憶測も入っていますが)Activityを呼び出したり戻したりすればonSaveInstanceStateとonRestoreInstanceStateが呼ばれるので、コードは一応通るのですが、大抵の場合はストレージ(?)への書き出し・読み込み処理は走らず、メモリ内のキャッシュデータを読み書きしているだけです。

ですが、いざという時(メモリ不足時?)には実際にストレージへの書き出し・読み込み処理が走り、いままで何の問題も無かった箇所で落ちる、何てことが起こりえます。

特に、カスタムViewを作り、Parcelオブジェクトを使って読み書きしている部分は、普段は処理が走らないので厄介です。
参考:
Viewの状態を保存する
http://ym02.blogspot.com/2010/08/view.html

iPhoneだとシミュレータでメモリ不足時のシミュレートが出来るようになっていますが、Androidはそのような事が出来るのでしょうか?
(知っている人いたら教えて下さい)

そこで、擬似的にこの辺りのテストを行うコードを書いてみました。

private void test()
{
	Parcel p1 = Parcel.obtain();
	Bundle b1 = new Bundle();
	onSaveInstanceState(b1);
	p1.writeBundle(b1);
	
	byte[] bytes = p1.marshall();
	
	Parcel p2 = Parcel.obtain();
	p2.unmarshall(bytes, 0, bytes.length);
	p2.setDataPosition(0);
	Bundle b2 = p2.readBundle();
	b2.setClassLoader(getClassLoader());
	onRestoreInstanceState(b2);
}

ただ、このコードによる保存・復元処理が正常時と同じかどうかは保障できません(^^;
また、私自身javaの経験が浅く、ClassLoader辺りはよく理解していません・・・。
(でもsetClassLoaderしないと、うまくparcelが取り出せないんですよね)

記事検索

アーカイブ