Androidで画面の向きを高速に変更

androidAndroid Developers BlogよりFaster screen orientation changeを読んで、個人的備忘録(なので、正確さは無保証です)。

Androidでは画面の縦横を切り替えるとき、リソース情報などの設定を変更してActivityを再スタートすることになる。このあたりはフレームワークが自動的にやってくれるので、開発者は気にする必要がない。しかし、Activityの再スタートにはコストがかかることがある。例えば、ネットワーク越しのリソース読み出しなど。

その場合には、onRetainNoneConfigurationInstance() をオーバーライドして、このなかで縦横切り替え後も必要なものをキャッシュしておく。そして、ActivityのonCreate()のなかで、getLastNonConfigurationInstance()を呼び出して、キャッシュを読み出せばよい。
#キャッシュはActivityやViewに紐づかないようにすること、メモリリークの原因になる

@Override
public Object onRetainNonConfigurationInstance() {
    // キャッシュする
    final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];
    keepPhotos(list);
    return list; // これがgetLastNoneConfigurationInstance()の戻り値になる
}
// キャッシュの読み出し
private void loadPhotos() {
    final Object data = getLastNonConfigurationInstance();
    
    // 初回時はネットから写真をロード
    if (data == null) {
        mTask = new GetPhotoListTask().execute(mCurrentPage);
    } else {
        // Activityが自動的に破壊/生成された。以前のActivityでロードした写真を読み出す
        final LoadedPhoto[] photos = (LoadedPhoto[]) data;
        for (LoadedPhoto photo : photos) {
            addPhoto(photo);
        }
    }
}