본문 바로가기
프로그래밍 놀이터/안드로이드, Java

[Android/안드로이드] 더 빠른 screen orientation change.

by 돼지왕 왕돼지 2012. 4. 16.
반응형



안녕하세요 돼지왕왕돼지입니다.

오늘은 "더 빠른 screen orientation change" 라는 주제로 이야기를 하고자 합니다.

이 글은  http://android-developers.blogspot.com/2009/02/faster-screen-orientation-change.html 를 의역한 글입니다.


더 빠른 screen orientation change.

Android 는 여러가지 hardware configuration 을 가진 여러 종류의 단말에 porting 되어 있습니다. 대부분의 단말이 hardware configuration 을 runtime 에 변환할 수 있습니다. 예를 들어, keyboard 를 열면, screen orientation 이 portrait 에서 landscape 로 변형됩니다. Android 는 configuration 변경시 자동으로 현재 activity 를 새로운 configuration 으로 restart 시킵니다. 그렇기 때문에 layout 이나 drawable 등을 orientation 에 맞게 정의하는 것이 필요한 것이죠.


이런 행동은 매우 강력하지만, device 의 configuration 을 runtime 에 자동으로 반영하기 때문에 android 개발자들에게 가끔은 혼란을 주기도 합니다. 왜 activity 가 destroy 되고, recreate 되는지 말이죠. 이런 configuration change 를 개발자가 직접 handle 하기도 하지만, 많은 경우 문제를 일으키는 방법을 사용하곤 합니다. 자동으로 resource 를 handle 해주는 것은 매우 효율적이고 쉬운 방법이지만, 가끔은 매우 큰 대가를 요구하곤 합니다.


만약 당신의 application 이 엄청난 양의 data 를 display 하거나, data 를 load 하는데 시간이나 메모리를 많이 사용하거나 한다면, 자동 activity 파괴 및 생성은 UX 를 나쁘게 할 가능성이 높습니다. Photostream 이 그 예입니다. Photostream 은 시작되면 6개의 사진을 Flickr server 에서 download 합니다. ( T-mobile G1 기준입니다. ). UX 개선을 위해서 portrait 와 landscape 에 알맞은 layout 과 drawable 을 설정했고 그것은 아래와 같이 보입니다.




Photostream 은 screen 이 회전했을 때 특별한 처리를 해줍니다. 하지만 download 를 다시한다면 그 작업이 얼마나 고된 것인지 상상이 가십니까? 가장 쉽게 생각할 수 있는 solution 은 이미지들을 cache 해놓는 것입니다. SD card 가 있다면 SD card 에 cache 를 하고, 아니면 Application에 static field 등을 이용하여 cache 를 할 수 있습니다. 하지만 Photostream 에는 이 방법 어느 것도 적용하지 않았습니다. 왜 screen 이 돌아가는데 cache 를 해야 하죠? 다행이도, Android 는 이런 목적에 적합한 훌륭한 API 를 제공합니다.


Activity class 는 onRetainNonConfigurationInstance() 라는 함수를 제공합니다. 이 함수에서 return 을 통해 전달되는 Object 는 후에 Configuration 등이 변환되어 recreate 되었을 때 값을 다시 가져올 수 있습니다. Photostream에는 이 방법을 사용했습니다. 구현은 다음과 같죠.


@Override

public Object onRetainNonConfigurationInstance() {

    final LoadedPhoto[] list = new LoadedPhoto[numberOfPhotos];

    keepPhotos(list);

    return list;

}


새로운 activity 의 onCreate() 에서는 getLastNonConfigurationInstance() 함수를 통해서 backup 해놓은 object 를 가져오는 것이죠. Photostream 에서는 이 함수를 호출하여 null 이 아닐 경우는 바로 grid 에 그려주고, null 일 경우는 다시 다운로드 받는 형식으로 하고 있습니다.


private void loadPhotos() {

    final Object data = getLastNonConfigurationInstance();

    

    // The activity is starting for the first time, load the photos from Flickr

    if (data == null) {

        mTask = new GetPhotoListTask().execute(mCurrentPage);

    } else {

        // The activity was destroyed/created automatically, populate the grid

        // of photos with the images loaded by the previous activity

        final LoadedPhoto[] photos = (LoadedPhoto[]) data;

        for (LoadedPhoto photo : photos) {

            addPhoto(photo);

        }

    }

}


onRetainNonConfigurationChange() 는 좋은 방법이지만 사용할 떄 많은 주의를 요합니다. Activity/Context 와 관련된 녀석을 return 하게 될 경우에는 memory leak 이 발생합니다. 다시 말해 절대 View, Drawable, Adapter 등을 return 해서는 안 된다는 이야기입니다. Photostream 는 Drawable 이 아닌 bitmap 만을 전달합니다. 마지막으로 onRetainNonConfigurationChange() 는 다시 load 할 때 시간이 오래 걸리거나 memory 를 많이 차지하는 등의 작업에만 사용되어야 합니다. 그렇지 않은 경우에는 android 가 알아서 하도록 그냥 두는 것이 좋습니다.


도움이 되셨다면 손가락 꾸욱~





 
반응형

댓글