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

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

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

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

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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が取り出せないんですよね)

記事検索

アーカイブ