Activityを切り替えずに、動的にListViewを作ったり消したりしていると、ガベージコレクションを何度実行しても回収されず、何故かメモリリークっぽい事になります。
以下再現ソースです。
(さらに…)
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が取り出せないんですよね)