4月 07
Android 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); } } }