Android 어플성능에 관한 고찰
어떤 모바일 어플을 개발하든 항상 성능 이슈는 있게 된다. 난 요즘 개발하고 있는 어플에 대한 성능 이슈 때문에 어떻게 하면 어플 성능을 항상 시킬 수 있을까에 대하여 고민하고 있다. 가장 큰 이슈는 ListView에 큰 이미지 파일을 보여줘야 하는 문제가 있었으며, 이를 해결하기 위하여 어떤 방식으로 이미지를 로드할까 하는 고민에 대하여 기술해 볼까 한다. 아래에 기술한 것이 답은 아니며, 해당 고민을 바탕으로 구현하고 결론 또한 써 볼까 한다.
1. 네트워크 기반 어플이 성능에 이슈되고 있는 것들
- 네트워크 상태에 따른 이미지 다운로드 속도
- 큰 이미지를 ListView에 로드할때 notifyDataSetChanged 시점 문제
- 큰 이미지를 서버에서 퀄리티 손상 없이 용량을 작게 내려 줄 수 있는지 문제 : 난 어플 개발자라 해당 문제는 서버개발자가 감수 해야 할 문제로 생략 하겠다.
- 이미지를 어떻게 캐쉬해야 할 것인가에 대한 문제.
2. 어플 성능 향상을 위해 고려해 봐야 할 기술 및 구조(ListView 중심)
- 네트워크 상태를 실시간으로 체크 할 수 있는지...
- 네크워크 상태가 좋지 않을 때 데이터 처리 방식
a. 데이터 정보를 파일로 가지고 있고 ListView 로드한다.
b. 데이터 정보를 DB에 가지고 있고 ListView 로드한다.
- 홀더패턴(holder pattern) 적용
- 메모리 캐쉬 적용
- 디스크 캐쉬 적용
- 파일 및 DB로 가지고 있는 데이터에 대해서 이미지는 메모리 캐쉬 및 디스크 캐쉬를 통하여 데이터를 가지고 있어야 함.
- 어플에 데이터를 로드하는 Flow 처리
3. 어플이 데이터를 받고 저장하는 Flow는 플로워
- 네트워크 상태를 체크 한다. 네트워크 상태에 따라 데이터 로드 방식을 결정한다.
- 파일 및 DB에 저장되어 있는 데이터를 ListView에 로드 한다.
- 최신 데이터를 요청하여 ListView에 로드 한다.
a. 파일 및 DB로 로드한 데이터를 어떻게 처리 할 것인지??
* 로드한 데이터를 유지하면서 최신 데이터를 로드한다.
* 로드한 데이터를 시작점으로 해서 데이터 차이에 따라 기존 데이터를 지우고 로드한다.
* 기존데이터는 지우고 로드한다.
☞ 기존데이터를 지우고 로드하지만 Key 값을 가지고 캐쉬된 데이터가 있을 경우는 해당 데이터를 가지고 로드하는 방향이 맞을 듯 한다.
4. 데이터 받는 Flow어에 따른 기술적 처리 및 로직
- 네트워크 상태가 좋지 않을 때 DB를 통해 데이터 로드
a. 테이블 설계
유니크 키값 |
이미지파일명 |
Text 1 |
Text2 | .... |
* 유니크 키값은 서버의 Row에서 부여한 유일 키로 한다.
b. 메모리 캐쉬
* http://developer.android.com/reference/android/util/LruCache.html
* http://androidanddevelop.blogspot.kr/2012/09/caching-bitmaps-caching-bitmaps.html
c. 디스크 캐쉬
* http://blog.naver.com/PostView.nhn?blogId=mirnae&logNo=100120412154 (메모리 / 디스크 캐쉬 관련)
* http://hi-android.info/src/com/cooliris/media/DiskCache.java.html
d. 메모리 / 디스크 캐쉬 적용 소스 및 설명 : http://blog.naver.com/PostView.nhn?blogId=huewu&logNo=110142842611 , http://www.androidhive.info/2012/07/android-loading-image-from-url-http/
e. 이미지를 가지고 올 때는 메모리 캐쉬 및 디스크 캐쉬를 사용하면 되고, ListView에 실제 로드 할 경우는 홀더패턴을 사용하게 됨.
* http://tigerwoods.tistory.com/14 , http://theeye.pe.kr/433, http://croute.me/503
- 서버에 데이터를 요청하고 ListView에 데이터를 재 로드할 때 캐쉬된 데이터가 있으면 로드하고 아니면 다시 서버에서 이미지 데이터를 받아 온다.
5. 코딩
- 참고 : http://theeye.pe.kr/entry/consideration-of-android-performance
- 같은 중간 계산 결과가 2번 이상 반복 사용되는 경우는 무조건 임시 변수를 사용하면 손해 볼것은 별로 없습니다.
'Dev Platfrom > 01. Android' 카테고리의 다른 글
안드로이드 JAR Library (0) | 2012.12.18 |
---|---|
Geocoder / getFromLocation ICS, 젤리빈 주소가져오기 오류 (0) | 2012.12.13 |
Parent Class와 Child Class와의 Event 흐름(부모와 자식 사이의 이벤트) (0) | 2012.10.25 |
Android Selector 속성 (0) | 2012.10.16 |
SNS 연동 (0) | 2012.10.16 |