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 정시 등.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
SQLite 성능 최적화 사례 공유이전에 비교적 많은 데이터의 읽기와 쓰기를 접하지 못했기 때문에 성능 최적화에 대한 관심이 많지 않다. 이번에는 특정한 장면의 대부분이 대량의 읽기와 쓰기에 대해 성능 최적화를 하여 성능을 10배 향상시켰다. 매번 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.