English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
이는 저가 MDCC에서 공유한 내용(약간 수정)이며,소스 코드 분석第一期에서 소개한 소스 코드 분석입니다. 소스 코드 분석은 계속 진행될 예정입니다。
여러 가지 이미지 캐시를 총괄적으로 설계와 원리에 대해 비교하며,그들에게 친숙하지 않은 사람들도 특정 특성에서의 구현을 이해할 수 있습니다。
1. 네 가지 주요 이미지 캐시의 기본 정보
Universal ImageLoader는 매우 오래된 오픈소스 이미지 캐시로서, 초기에는 많은 애플리케이션에서 사용되었습니다。
Picasso는 Square에서 오픈소스로 출시된 프로젝트로서, 주도자는 JakeWharton으로 유명합니다.
Glide는 Google 직원의 오픈소스 프로젝트로서, 몇 가지 Google 앱에서 사용되고 있으며, 작년의 Google I에서 소개되었습니다。/O에서 추천되었지만, 현재 국내 자료는 많지 않습니다。
Fresco는 올해 상반기에 Facebook에서 오픈소스로 출시된 이미지 캐시로서 주요 특징은 다음과 같습니다:
(1두 개의 메모리 캐시와 네이티브 캐시를 결합하여 세 가지 캐시로 구성됩니다。
(2스트리밍을 지원하며, 웹 페이지에서의 흐림 진행형 이미지 표시와 유사하게 이미지를 표시할 수 있습니다。
(3다중 프레임 애니메이션 이미지에 대한 지원이 더 좋습니다. 예를 들어 Gif, WebP와 같은 경우
Fresco가 공식적으로 발표되지 않았기 때문에 1.0 버전이며, Fresco 소스 코드에 대해 많은 시간을 보내지 않았기 때문에, 이후 비교에는 Fresco를 포함하지 않았습니다. 미래에 시간이 되면 비교에 포함할 예정입니다。
더 많은 이미지 캐시 라이브러리는 Android 이미지 캐시 라이브러리에서 찾을 수 있습니다:
2. 기본 개념
정식 비교 전에 먼저 몇 가지 일반적인 이미지 캐시 개념을 이해해야 합니다:
(1RequestManager:요청 생성 및 관리 모듈
(2Engine:엔진 부분,타스크(데이터 가져오기)를 생성하고 실행을 조정하는 책임을 맡습니다。
(3GetDataInterface:데이터 가져오기 인터페이스,여러 데이터 소스에서 데이터를 가져오는 책임을 맡습니다。
예를 들어 MemoryCache는 메모리 캐시에서 데이터를 가져오고、DiskCache는 로컬 캐시에서 데이터를 가져오고、다운로드 메니저는 네트워크에서 데이터를 가져오는 등입니다。
(4Displayer:자원(이미지) 디스플레이어,자원을 표시하거나操作하는 데 사용됩니다。
예를 들어 ImageView, 이러한 이미지 캐시는 ImageView를 지원하는 것 외에도 다른 View 및 가상의 Displayer 개념을 지원합니다.
(5) Processor 자원(이미지) 프로세서
데이터 처리를 담당합니다. 예를 들어, 회전, 압축, 잘라내기 등.
이러한 개념의 이름은 다른 이미지 캐시에서 다를 수 있습니다. 예를 들어, Displayer는 ImageLoader에서 ImageAware라고 불리지만, Picasso와 Glide에서는 Target라고 불립니다.
3. 공통 장점
1. 사용이 간단합니다
이미지 가져오기와 표시를 한 줄의 코드로 구현할 수 있습니다.
2. 고도로 구성 가능하고 자율적입니다
이미지 캐시 다운로드 메커니즘(재시도 기능), 디코더, 디스플레이어, 프로세서, 메모리 캐시, 로컬 캐시, 스레드 풀, 캐시 알고리즘 등 대부분을 쉽게 구성할 수 있습니다.
고도로 자율적이며, 시스템 성능에 따라 캐시 구성을 초기화하고, 시스템 정보가 변경되면 전략을 동적으로 조정합니다.
예를 들어 CPU 코어 수에 따라 최대 동시 수를 결정하고, 사용 가능한 메모리에 따라 메모리 캐시 크기를 결정하고, 네트워크 상태가 변경될 때 최대 동시 수를 조정합니다.
3. 다중 캐시
최소 두 개의 캐시를 갖추고 이미지 로드 속도를 높입니다.
4. 다양한 데이터 소스를 지원합니다
다양한 데이터 소스를 지원합니다. 네트워크, 로컬, 자원, Assets 등
5. 다양한 Displayer를 지원합니다
ImageView를 지원하는 것 외에도 다른 View 및 가상의 Displayer 개념을 지원합니다.
기타 작은 공통점으로는 애니메이션 지원, transform 처리 지원, EXIF 정보 가져오기 등이 있습니다.
4. ImageLoader 설계 및 장점
1. 전반적인 설계 및 프로세스
위는 ImageLoader의 전반적인 설계도입니다. 전체 라이브러리는 ImageLoaderEngine, Cache 및 ImageDownloader, ImageDecoder, BitmapDisplayer, BitmapProcessor의 다섯 가지 모듈로 나뉩니다. Cache는 MemoryCache와 DiskCache로 나뉩니다.
간단히 말해 ImageLoader가 이미지를 로드하고 표시할 작업을 받아들여 ImageLoaderEngine에 맡기고, ImageLoaderEngine는 특정 스레드 풀로 작업을 분배하여 실행합니다. 작업은 Cache 및 ImageDownloader를 통해 이미지를 가져오고, BitmapProcessor 및 ImageDecoder를 통해 처리되며, 마지막으로 BitmapDisplayer가 ImageAware에서 표시합니다.
2ImageLoader 장점
(1다운로드 진행 상황을 감지할 수 있습니다.
(2뷰 스크롤 중에 이미지 로드를 일시 중지할 수 있습니다.
PauseOnScrollListener 인터페이스를 통해 뷰 스크롤 중에 이미지 로드를 일시 중지할 수 있습니다.
(3기본적으로 다양한 메모리 캐시 알고리즘을 구현합니다. 이러한 이미지 캐시는 모두 캐시 알고리즘을 설정할 수 있으며, ImageLoader는 기본적으로 많은 캐시 알고리즘을 구현합니다. 예를 들어, Size 최대 먼저 지우기, 사용된 최초 먼저 지우기, 최근 최소 사용, 최초 먼저 지우기, 시간이 가장 오래된 먼저 지우기 등.
(4로컬 캐시 파일 이름 규칙 정의 지원
5. Picasso 설계 및 장점
1. 전반적인 설계 및 프로세스
위는 Picasso의 전반적인 설계도입니다. 전체 라이브러리는 Dispatcher, RequestHandler, Downloader, PicassoDrawable 등의 모듈로 나뉩니다.
Dispatcher는 작업을 배포하고 처리하는 책임을 가지고 있으며, 제출, 일시 중지, 계속, 취소, 네트워크 상태 변경, 재시도 등을 포함합니다.
간단히 말해서 Picasso는 이미지 로드 및 표시 작업을 받아 Request를 생성하고 Dispatcher에게 전달합니다. Dispatcher는 작업을 특정 RequestHandler에 배포하고, 작업은 MemoryCache 및 Handler(데이터 가져오기 인터페이스)를 통해 이미지를 가져오며, 이미지 가져오기 성공 후 PicassoDrawable을 통해 Target에 표시합니다.
위의 Data의 파일 시스템 부분에 주의해야 합니다. Picasso는 로컬 캐시를自定义하지 않는 인터페이스가 없으며, 기본적으로 http의 로컬 캐시를 사용합니다. API 9 위에서 okhttp를 사용하고, 아래에서 Urlconnection을 사용하기 때문에自定义 로컬 캐시가 필요하다면 Downloader를 재정의해야 합니다.
2Picasso 장점
(1내장된 통계 모니터링 기능이 있습니다.
이미지 캐시 사용을 모니터링 지원, 캐시命中率, 사용된 메모리 크기, 절약된 트래픽 등을 포함합니다.
(2) 우선순위 처리를 지원합니다
매번 작업 조정 전에 우선순위가 높은 작업을 선택합니다. 예를 들어, App 페이지에서 배너의 우선순위가 아이콘보다 높을 때 매우 적합합니다.
(3이미지 크기 계산이 완료되면 로드되도록 지연 지원합니다.
(4비행 모드 지원, 네트워크 유형에 따라 동시 실행 스레드 수가 달라집니다.
핸드폰이 비행 모드로 전환되거나 네트워크 유형이 변할 때 자동으로 스레드 풀 최대 동시 실행 횟수를 조정합니다. 예를 들어 wifi의 최대 동시 실행 횟수는}} 4، 4g는 3،3g는 2
여기서 Picasso는 네트워크 유형에 따라 최대 동시 실행 횟수를 결정하며, CPU 핵수가 아니라.
(5) “로컬 캐시가 없음”
“로컬 캐시가 없음”은 로컬 캐시가 없는 것이 아니라, Picasso 자체가 로컬 캐시를 구현하지 않고 Square의 또 다른 네트워크 라이브러리 okhttp에 맡겼다는 것을 의미합니다. 이러한 장점은 요청 Response Header의 Cache를 통해 캐시를 사용할 수 있습니다.-Control 및 Expired을 통해 이미지의 만료 시간을 제어합니다.
6. Glide 설계 및 장점
1. 전반적인 설계 및 프로세스
위는 Glide의 전반적인 설계도입니다. 전체 라이브러리는 RequestManager(요청 관리자), Engine(데이터 가져오기 엔진), Fetcher(데이터 가져오기 기기), MemoryCache(메모리 캐시), DiskLRUCache, Transformation(이미지 처리), Encoder(로컬 캐시 저장), Registry(이미지 타입 및 파서 설정), Target(목표) 등의 모듈로 나뉩니다.
간단히 말해 Glide는 로드 및 표시 자원의 작업을 받으면, Request를 생성하고 RequestManager에게 넘겨주며, Request는 Engine를 통해 데이터 소스에서 자원을 가져오기 시작합니다(Fetcher를 통해), 가져온 후 Transformation을 처리하여 Target에게 넘겨줍니다.
Glide는 DiskLRUCache, GifDecoder 등의 오픈소스 라이브러리를 통해 로컬 캐시와 Gif 이미지 디코딩 작업을 완료합니다.
2. Glide의 장점
(1) 이미지 캐시-> 미디어 캐시
Glide는 단순한 이미지 캐시가 아니라, Gif, WebP, 缩약图를 지원하며, 심지어 Video도 지원하여 미디어 캐시로 더 적합합니다.
(2) 우선순위 처리를 지원합니다
(3) Activity와 유지합니다/Fragment 생명주기는 일관되며 trimMemory를 지원합니다.
Glide는 각 context에 대해 RequestManager를 유지하며, FragmentTransaction을 통해 Activity와 유지합니다/Fragment의 생명주기가 일관되며, trimMemory 인터페이스 구현이 호출할 수 있습니다.
(4) okhttp, Volley를 지원합니다
Glide는 기본적으로 UrlConnection을 통해 데이터를 가져오며, okhttp 또는 Volley와 함께 사용할 수 있습니다. 실제로 ImageLoader, Picasso도 okhttp, Volley를 지원합니다.
(5) 메모리 친화적
① Glide의 메모리 캐시는 active 디자인을 가지고 있습니다.
메모리 캐시에서 데이터를 가져오면 일반적인 get 대신 remove를 사용하고, 이缓存 데이터를 소프트 레퍼런스가 value인 activeResources 맵에 추가하고, 참조 횟수를 계산하고, 이미지가 로드되면 참조 횟수가 없으면 회수합니다.
② 메모리 캐시는 더 작은 이미지를 저장합니다.
Glide는 URL, view_width, view_height, 화면의 해상도 등을 조합된 키로 사용하여 처리된 이미지를 메모리 캐시에 저장하고, 원본 이미지를 저장하지 않고 크기를 절약합니다.
③ Activity와 함께/Fragment 생명주기는 일관되며 trimMemory를 지원합니다.
④ 이미지는 기본적으로 기본 RGB_를 사용합니다.565 그 대신 ARGB_888
해상도가 낮지만, 이미지가 작고 ARGB_에 설정할 수도 있습니다.888
기타: Glide는 signature를 통해 URL이 만료되지 않도록 지원하거나 로컬 캐시를 사용하지 않습니다.
7. 요약
이 세 가지는 모두로 볼 때, ImageLoader의 기능과 대리기의 이해가 일반적이며 길이도 일반적입니다.
Picasso의 코드는 단 하나의 패키지에 있지만 패키지 구분이 엄격하지 않지만, 코드가 간단하고 논리가 명확하여 몇 시간 동안 깊이 이해할 수 있습니다.
Glide는 강력하지만 코드량이 많고 복잡하므로, 깊이 이해한 후 사용하는 것이 좋습니다. 문제가 발생하면 해결하기 어려울 수 있습니다.
이것이 본 문서의 전체 내용입니다. 여러분의 학습에 도움이 되길 바랍니다. 또한,呐喊 튜토리얼에 많은 지지를 부탁드립니다.
고지사항: 본 문서의 내용은 인터넷에서 가져왔으며, 저작권자는 본 웹사이트에 소유되지 않으며, 인터넷 사용자가 자발적으로 기여하고 업로드한 내용입니다. 본 웹사이트는 저작권을 소유하지 않으며, 인공적으로 편집되지 않았으며, 관련 법적 책임도 부담하지 않습니다. 저작권 침해가 의심되는 내용이 있으면 notice#w로 이메일을 보내 주세요.3codebox.com에 이메일을 보내면 (#을 @으로 변경해야 합니다) 신고하고 관련 증거를 제공해 주세요. 확인되면 해당 저작권 침해 내용을 즉시 삭제할 것입니다.