Bucket Place/Android

[Android] ViewPager 동작 방식

Cloud Travel 2014. 3. 20. 14:37

안녕하세요. Bucket Place 개발자 Cloud Travel입니다.


지난번엔 ViewPager를 구현하고 이를 이용하여 Tabs처럼 이용하는 법에 대해서

알아보았습니다. 이번엔 ViewPager의 동작방식에 대해서 알아보도록 합시다.


ViewPager는 Fragment를 이용하여 화면 전환 없이 좌우 스크롤을 이용하여 페이지

일부분을 전환 할 수 있는 UI입니다. ViewPager는 기본적으로 좌우 화면을 미리

메모리에 올려 두기 때문에 좌우 스크롤시 지연시간을 줄여 빠르게 화면을 보여주는

것이 가능하게 해준다.


스크롤을 넘기는 도중에 이미 옆에 페이지가 보이는 이유이죠...



위쪽의 사진은 페이지를 옆으로 넘기고 있는디 이미 옆에 페이지가 존재하고 있는 것을 보여주죠.

 

 


ViewPager가 미리 양쪽의 화면을 로딩하기 때문에 메모리에 문제가 존재합니다. 위 사진을 보도록 합시다.

2번 페이지가 현재 페이지로 설정된다면, 1번과 3번이 미리 메모리에 올려놓게 된다. 여기서 현재화면이 3번으로 이동을 한다면

1번 페이지는 메모리에서 사라지고, 4번 화면에 메모리에 올라오게 된다. 여기서 다시 2번페이지로 이동한다면 4번 페이지는

메모리에서 사라지고, 1번화면이 다시 메모리로 올라오게 됩니다. 이렇게 좌우 화면을 미리 불러 오는 것은 메모리에 접근하는

횟수를 늘리게 되며, 이로인해 성능 저하를 가져 올 수 있습니다. 또한, 좌우 화면일 미리 가지고 있는 것이 메모리 낭비라고 생각 할 수 있습니다.



첫번째 방식은 메모리 사용량을 줄이고자 하는 노력이 있습니다.


이는 현재보고 있는 페이지만을 메모리에 올리는 방식을 택하게 됩니다. 이러면 사용자에게 답답함을 줄 수 있다.

앞선 글에서 소개한 viewPager.OnPageChangeListener() 리스너를 이용합니다.

 mViewPager.setOnPageChangeListener(new OnPageChangeListener() {
     
    @Override
    public void onPageSelected(int state) {
         // Page가 선택되었을 경우
    }
     
    @Override
    public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
         // 페이지가 스크롤 되었을때
    }
     
    @Override
    public void onPageScrollStateChanged(int position) {
         // 변경된 페이지 위치를 call back해준다.
         // 이부분을 잘처리하면 사용자가 보는 화면 만을 로딩하게 된다.
    }
});



두번째 방식은 메모리의 사용량을 늘리데 메모리 접근 횟수를 줄이는 방식입니다.


미리 모든 페이지를 메모리에 올려 놓고 쓰는 것이다. 만약 화면이 여러개 존재한다면, 메모리 점유율이 높아서 성능이 오히려

떨어질 가능성이 많다. 이는 viewPager.setOffscreenPageLimit(int 개수)를 이용하여 미리 모든 페이지를 로딩하면된다.

mViewPager.setOffscreenPageLimit(int number);