Android 성능 최적화 및 데이터 최적화 방법

Android 성능 최적화-레이아웃 최적화
오늘,계속 안 드 로 이 드 성능 최적화 인 코딩 디 테 일 최적화.
인 코딩 디 테 일 은 프로그램의 운행 효율 에 도 많은 영향 을 미친다.오늘 이 주 제 는 기 술 력 에 한계 가 있 기 때문에 깊 은 곳 에서 여러분 과 나 눌 수도 없습니다.나 는 이 주 제 를 다음 과 같은 몇 마디 로 나 누 었 다.
(1)캐 시
(2)데이터
(3)로드 지연 및 우선 로드
1>캐 시
Android 에서 캐 시 는 대상,IO,네트워크,DB 등 여러 곳 에 사용 할 수 있 습 니 다.대상 캐 시 는 메모리 분 배 를 줄 일 수 있 고,IO 캐 시 는 디스크 에 대한 읽 기와 쓰기 접근 을 줄 일 수 있 으 며,네트워크 캐 시 는 네트워크 에 대한 접근 을 줄 일 수 있 으 며,DB 캐 시 는 데이터베이스 에 대한 조작 을 줄 일 수 있다.
캐 시 대상 장면 은 Android 개발 에서 도 뚜렷 합 니 다.
(1)이미지 캐 시
Android 에 서 는 LruCache 캐 시 메커니즘 을 제공 합 니 다.우 리 는 LruCache 를 사용 하여 그림 의 캐 시 를 진행 할 수 있다.그림 에 대한 캐 시 처리 절 차 는 일반적으로:
그림 불 러 오기->캐 시 에 존재 하 는 지 판단->존재 하 는 지 직접 꺼 내 ImageView 에 설정->존재 하지 않 으 면 네트워크 에 그림 다운로드 요청->그림 다운로드 에 성공 하여 이미지 캐 시 를 ImageView 에 설정 합 니 다.
안 드 로 이 드 에는 우수한 제3자 오픈 소스 라 이브 러 리 가 많 기 때문에 우 리 는 바퀴 를 반복 할 필요 가 없다.예 를 들 어 Fresco(FaceBook 제품),Picasso,Glide,UIL.
(2)자주 바 뀌 지 않 는 데이터
 자주 바 꿀 필요 가 없 는 데이터,예 를 들 어 앱 의 일부 제품 분류.우 리 는 그것 을 캐 시 할 수 있다.매번 네트워크 에 데 이 터 를 불 러 오 라 고 요청 할 필요 가 없다.이것 은 비교적 이해 하기 쉬 우 니 더 이상 말 하지 않 겠 다.
(3)ListView 의 캐 시
ListView Item 데이터 의 캐 시 는 모두 가 잘 알 고 있 을 것 이 라 고 믿 습 니 다.Adapter 류 의 getView 방법 에서 convertView 재 활용 원 리 를 이용 하여 ViewHolder 를 만들어 재 활용 하 는 것 입 니 다.Material Design 에서 도 ListView 대신 RecyclerView 를 제공 했다.Adapter 에서 View Holder 를 사용 하여 View 를 재 활용 하도록 강요 할 것 입 니 다.
(4)메시지 캐 시
이 메 시 지 는 Handler 에서 보 낸 Message 를 말 합 니 다.시스템 은 메 시 지 를 재 활용 하기 위해 서 obtainmessage()를 제공 합 니 다.소스 코드 를 살 펴 보 겠 습 니 다.

/**
 * Return a new Message instance from the global pool. Allows us to
 * avoid allocating new objects in many cases.
 */
public static Message obtain() {
 synchronized (sPoolSync) {
 if (sPool != null) {
  Message m = sPool;
  sPool = m.next;
  m.next = null;
  m.flags = 0; // clear in-use flag
  sPoolSize--;
  return m;
 }
 }
 return new Message();
}
상기 코드 에서 sPool 은 캐 시 된 Message 인 스 턴 스 입 니 다.먼저 null 이 아니라면 직접 재 활용 하지 않 으 면 새로운 Message 인 스 턴 스 를 만 들 것 이 라 고 판단 합 니 다.
(5)IO 캐 시
       사실 자바 에 서 는 캐 시 정책 을 가 진 IO 흐름 을 제공 합 니 다.
BufferedReader、BufferedWriter。이러한 IO 흐름 을 사용 하여 InputStream,Reader,OutputStream,Writer 등 을 대체 합 니 다.
2>데이터
데이터 저장 에 대한 최 적 화 는 데이터 유형 과 구조 에서 구분 할 수 있다.
(1)문자열 을 StringBuilder 나 StringBuffer 로 연결 하여 대상 의 임시 분 배 를 줄인다.StringBuilder 와 StringBuffer 의 차 이 는 사실 한 가지 입 니 다.병행 작업 에서 StringBuffer 는 스 레 드 가 안전 합 니 다.유리 한 점도 있 고 해로 운 점도 있 으 며 스 레 드 가 안전 한 동시에 집행 속도 도 떨 어 졌 다.따라서 다 중 스 레 드 작업 이 아 닌 경우 StringBuilder 를 사용 합 니 다.StringBuilder 와 StringBuffer 의 구조 함 수 는 공간 크기 를 초기 화하 기 위해 수량 급 으로 들 어 갈 수 있 습 니 다.따라서 일정한 공간 크기 를 분배 하고 메모리 자원 을 절약 할 수 있다.
(2)Weak Reference 를 사용 합 니 다.약 한 인용 이 가 져 온 좋 은 점 은 모두 가 잘 알 고 있 을 것 이다.특히 안 드 로 이 드 와 같은 메모리 공간 이 제 한 된 장치 에 서 는 메모리 의 배분 과 방출 이 중요 하 다.Weak Reference 가 사용 하 는 전형 적 인 장면 은 Handler 입 니 다.Activity 나 Fragment 에서 Handler 를 사용 하 는 것 은 일반적으로 내부 클래스 로 이 루어 진 다 는 것 을 잘 알 고 있다.이렇게 하면 문 제 를 일 으 킬 것 이다.handler 의 한 작업 이 오래 수행 된다 면 Activity 나 Fragment 가 풀 려 나 야 할 때(onDestory)handler 와 연 결 된 Message 가 아직 실행 되 지 않 았 기 때 문 입 니 다.이때 handler 는 방출 되 지 않 습 니 다.handler 는 Activity 나 Fragment 와 관련 되 기 때문에 Activity 나 Fragment 가 효과적으로 방출 되 지 못 하고 결국은 자원 이 방출 되 지 못 하 게 됩 니 다.결 과 는 다음 과 같 습 니 다.oom.따라서 이 문 제 를 해결 하 는 방법 은 WeakReference 를 사용 하거나 Handler 를 static 로 정의 하 는 것 이다.다음은 Weak Reference 를 사용 하 는 방법 입 니 다.

private final MyHandler myHandler = new MyHandler(this);
private static class MyHandler extends Handler {
 private final WeakReference<HomeFragment> m;
 public MyHandler(HomeFragment homeFragment){
 m = new WeakReference<HomeFragment>(homeFragment);
 }
 @Override
 public void handleMessage(Message msg) {
 HomeFragment homeFragment = m.get();
  if(homeFragment != null) {
  homeFragment.vpBanner.setCurrentItem(msg.arg1);;
 }
 }
}
코드 는 간단 합 니 다.바로 Fragment 를 Weak Reference 에 두 는 것 입 니 다.handle Message 에서 그 중의 View 를 직접 꺼 냅 니 다.
데이터 구 조 는 ArrayList 와 LinkedList,LinkedHashMap 과 HashSet,Weak HashMap 등 이 비교적 많다.
(1)ArrayList 는 데이터 에 대한 조회 속도 가 비교적 빠 르 고 LinkedList 는 데이터 에 대한 삽입 과 삭제 속도 가 ArrayList 보다 빠르다.
(2)LinkedHashMap 은 데이터 가 저 장 된 순 서 를 기억 할 수 있 으 며,HashSet 은 중복 되 는 요소 가 존재 하 는 것 을 허용 하지 않 습 니 다.Weak HashMap 의 데 이 터 는 적합 할 때 시스템 GC 에 의 해 자동 으로 회수 되 어 메모리 가 부족 한 장면 에 적합 합 니 다.
(3)Collections 도구 류 에서 도 다 중 스 레 드 에서 조작 하기에 적합 한 집합 을 많이 제공 하고 성능 을 향상 시 켰 다.예 를 들 어
(4)Android 에서 시스템 도 성능 이 더 좋 은 데이터 형식 을 제공 합 니 다.예 를 들 어 SparseArray,SparseBooleanArray,SparseIntArray,Pair.Sparse 의 key 는 Int 형식 입 니 다.2 분 검색 및 간단 한 배열 로 저장 합 니 다.또한 일반적인 전환 비용 이 필요 없 이 맵 에 비해 성능 이 좋 습 니 다.
3>로드 지연
안 드 로 이 드 에서 불 러 오 는 것 을 지연 시 키 는 용도 도 비교적 광범 위 하 다.예 를 들 어 ViewPager 에서 Fragment 데이터 의 지연 불 러 오 는 것 이다.ViewPager 는 기본적으로 두 내용 을 초기 화 했 기 때 문 입 니 다.그래서 로드 지연 을 처리 해 야 합 니 다.
마찬가지 로 Activity 나 Fragment 에서 시간 에 민감 한 함수 에서 시간 소모 작업 을 하지 않 습 니 다.ANR 의 이상 발생 을 피하 다.
자바 에 서 는 로 딩 지연 으로 ScheduledxecutorService 를 제공 합 니 다.사실 Timer 타이머 의 지연 시간 은 bug 가 존재 합 니 다.타 이 머 는 추천 하지 않 습 니 다.홍 양 블 로 그 는 이 Timer 의 결함:Timer 결함 에 대해 이야기 하고 있다.
Android 에 서 는 handler 의 일부 방법 을 사용 하여 작업 을 지연 시 킬 수 있 습 니 다.
(1)postDelayed
(2)postAtTime
(3)sendMessageDelayed
그리고 View 의 postDelayed,AlarmManager 정시 등.

좋은 웹페이지 즐겨찾기