본문 바로가기

Dev Platfrom/01. Android

Android 어플성능에 관한 고찰

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번 이상 반복 사용되는 경우는 무조건 임시 변수를 사용하면 손해 볼것은 별로 없습니다.