이전 프로젝트 에 서 는 Volley 의 ImageView Request 로 그림 을 불 러 왔 습 니 다.그러나 나중에 프로젝트 가 정교 해 지면 서 그림 요청 과 제 이 슨 의 데이터 요청 을 분리 해서 사용 하 는 것 이 좋 을 것 같 습 니 다.인터넷 에서 많은 자 료 를 찾 았 고 실천 비교 도 했다.프로젝트 에 okHhttp + Glide 를 네트워크 요청 방식 으로 선 택 했 습 니 다.
okHttp 는 나중에 글 에서 소개 하 겠 습 니 다. 오늘 은 Glide 용법 과 원리 분석 만 보면 됩 니 다.이것들 은 모두 제 가 인터넷 에서 정리 한 것 입 니 다. 여러분 이 오리지널 을 보 려 면 인터넷 주소 Google 에서 추천 하 는 이미지 로 딩 라 이브 러 리 Glide 소개 입 니 다.
글 라 이 드 는 구 글 이 우리 에 게 사진 로 딩 라 이브 러 리 를 소개 한 것 으로 저 자 는 bumptech 이다.이 라 이브 러 리 는 2014 년 구 글 I / O 대회 에서 발 표 된 공식 앱 을 포함 하여 구 글 의 오픈 소스 프로젝트 에 광범 위 하 게 활용 되 고 있다.그것 의 사용 은 비교적 편리 하 다.V4 팩 의 지원 이 필요 합 니 다.글 라 이 드 패키지 가 져 오 면 됩 니 다.
Glide.with(context)
.load("http://inthecheesefactory.com/uploads/source/glidepicasso/cover.jpg")
.into(ImageView);
이곳 의 Context 는 Activity, Fragment 등 이 될 수 있다.기본 Bitmap 형식 RGB565. 이 동시에 그 는 그림 의 크기 도 지정 할 수 있다.기본적으로 HttpUrlConnection 을 사용 하여 그림 을 다운로드 합 니 다. OkHttp 또는 Volley 다운로드 로 설정 할 수도 있 고 다운로드 방식 을 사용자 정의 할 수도 있 습 니 다.
Glide 는 그림 디스크 캐 시 를 지원 합 니 다. 기본 값 은 내부 저장 소 입 니 다.Glide 캐 시 는 ImageView 크기 와 같 습 니 다.
Glide.with(this)
.load("http://nuuneoi.com/uploads/source/playstore/cover.jpg")
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(ivImgGlide);
이렇게 하면 ImageView 크기 뿐만 아니 라 다른 크기 도 캐 시 할 수 있 습 니 다.다음 에 ImageView 의 그림 을 불 러 올 때 전체 크기 의 그림 은 캐 시 에서 꺼 내 크기 를 다시 조정 한 다음 캐 시 합 니 다.이렇게 그림 을 불 러 오 면 곧 표 시 됩 니 다.
내 려 와. 글 라 이 드 의 원 리 를 말 하고 싶 어.구체 적 으로 글 라 이 드 이미지 로 더 상세 설명 을 볼 수 있 습 니 다.
1. Glide 의 자원 가 져 오기 구성 요소:
모델: 원시 자원, 예 를 들 어 Url, AndroidResource Id, File 등 Data: 중간 자원, 예 를 들 어 Stream, ParcelFileDescriptor (ContentProvider 가 파일 을 공유 할 때 자주 사용 되 는데 사실은 운영 체제 의 파일 설명자 의 패키지 입 니 다. 그 안에 in out err 세 개의 값 이 있 습 니 다. 링크 가 만들어 진 후의 socket 구문 손잡이 라 는 말 도 있 습 니 다.) 등 Resource: Bitmap, Drawable 등 직접 사용 하 는 자원 2. Glide 라 이브 러 리 의 자원 재 활용:
Android 의 메모리 신청 은 거의 new 일 때 발생 하 는데 new 의 큰 대상 (예 를 들 어 Bitmap 일 때) 은 GC 를 더욱 쉽게 촉발 합 니 다.FOR_ALLOW。그래서 Glide 는 불필요 한 GC 를 방지 하기 위해 자원 을 최대한 재 활용 합 니 다.FOR_ALLOC 가 카드 를 일 으 켰 다. 가장 눈 에 띄 는 메모리 재 활용 은 바로 메모리 LruResourceCache (네트워크 나 디스크 에서 리 소스 를 처음 읽 었 을 때 LruCache 에 저장 되 지 않 습 니 다. 리 소스 가 release 되 었 을 때, 즉 View 가 이 리 소스 가 필요 하지 않 을 때 만 LruCache 에 들 어 갑 니 다) 그리고 BitmapPool (Glide 는 가능 한 한 이미지 풀 로 재 활용 가능 한 그림 을 가 져 와 야 new 를 가 져 올 수 있 으 며, LruCache 가 Evicted 를 터치 할 때 LruCache 에서 탈락 한 Bitmap 를 회수 하고 transform 에 사용 되 는 중간 Bitmap 를 재 활용 및 회수 합 니 다) 3. Glide 라 이브 러 리 이미지 풀:
4.4 예전 에는 Bitmap 재 활용 이 었 는데 길이 가 같 아야 재 활용 이 가능 했다 4.4 및 이후 크기 > = 필요 하면 재 활용 할 수 있 으 며, 크기 조정 을 위해 reconfigure 를 사용 해 야 합 니 다 Glide 는 Attribute Stategy 와 Size Strategy 로 두 가지 전략 을 실현 한다 이미지 풀 은 들 려 오 는 Bitmap 를 받 은 후에 길이 나 크기 를 통 해 KeyPool 에서 Key (대상 이 극치 로 재 활용 되 었 고 Key 까지 Pool 을 사용 했다) 를 얻 은 다음 에 각 Key 는 하나의 양 방향 링크 구조 에 대응 하여 저장 된다.키 마다 비트 맵 이 많이 있 을 수 있 습 니 다.
추출 후 이미지 풀 에 기 록 된 현재 Size 등 을 줄 이 고 Bitmap 에 eraseColor (Color. TRANSPAENT) 작업 을 하여 사용 가능 한 지 확인 합 니 다 4. Glide 로드 시작 절차:
Glide. with (context) 요청 관리자 만 들 기 RequestManager 는 현재 context 의 모든 Request 를 관리 합 니 다.
Context 는 Fragment, Activity 또는 다른 Context 를 전송 할 수 있 으 며, Fragment, Activity 를 전송 할 때 현재 페이지 에 대응 하 는 Activity 의 생명주기 가 RequestManager 에 의 해 감 측 될 수 있어 Request 의 pause, resume, clear 를 제어 할 수 있다.이 가운데 사용 되 는 모니터링 방법 은 현재 activity 에 view 가 없 는 fragment 를 추가 하 는 것 입 니 다. 이렇게 하면 activity 에서 onStart onStop onDestroy 가 발생 할 때 이 fragment 의 onStart onStop onDestroy 를 촉발 합 니 다. RequestManager 는 현재 페이지 의 Request 를 추적 하 는 데 사용 되 는 Request 클래스 입 니 다. 실행 중인 Request 를 약 인용 으로 저장 하고, 복구 할 Request 를 강 인용 으로 저장 합 니 다. Glide. with (context). load (url) 생 성 에 필요 한 Request 보통 Drawable TypeRequest 입 니 다. 그 다음 에 transform, fitCenter, animate, placeholder, error, override, skipMemory Cache, signature 등 을 추가 할 수 있 습 니 다 리 소스 전환 이 필요 하 다 면 Byte 배열 로 전환 하 는 등 필요 하 다 면 asBitmap 를 추가 하여 BitmapTypeRequest 로 변경 할 수 있 습 니 다.
Request 는 Glide 에서 그림 을 불 러 오 는 실행 단위 Glide.with(context).load(url).into(imageview) Request 의 into 방법 에서 Request 의 begin 방법 을 호출 하여 실행 합 니 다 Engine Job 을 정식으로 생 성하 여 Engine 에 넣 고 실행 하기 전에 필요 한 너비 와 높이 를 미리 override (width, height) 로 지정 하지 않 으 면 Glide 는 imageview 의 너비 와 높이 를 가 져 오 려 고 시도 합 니 다. 현재 imageview 가 초기 화 되 지 않 았 다 면 높이 를 가 져 오지 못 합 니 다.Glide 는 view 의 ViewTreeObserver 를 통 해 View 초기 화 완료 후 너비 와 높이 를 가 져 와 다음 단계 로 넘 어 갑 니 다 5. Glide 로 딩 자원:
Glide Builder 는 Glide 를 초기 화 할 때 실행 기 Engine 을 생 성 합 니 다.
Engine 에는 LruCache 캐 시 및 현재 사용 중인 active 자원 Cache (약 참조) 가 포함 되 어 있 습 니 다.
activeCache 는 LruCache 를 보조 합 니 다. 리 소스 가 LruCache 에서 꺼 내 사용 할 때 LruCache 에서 remove 하고 acticeCache 에 들 어 갑 니 다 Cache 우선 순위 LruCache > activeCache Engine 은 초기 화 할 때 두 개의 Executor Service 에 들 어 갑 니 다. 하 나 는 DiskCache 에서 resource 를 가 져 오고 다른 하 나 는 Source 에서 가 져 옵 니 다 (보통 다운로드) .
스 레 드 의 패 키 징 단 위 는 EngineJob 입 니 다. 두 가지 순서 상태 가 있 습 니 다. 먼저 CacheState 입 니 다. 이 상태 에서 DiskCacheService 에 들 어가 서 가 져 오기, 찾 지 못 하면 SourceState 에 들 어가 서 SourceService 에 들 어가 서 다운로드 하기 6. Glide 의 Target:
그림 불 러 오 는 리 셋 담당
요약:
Glide 라 이브 러 리 는 사용 과정 에서 비교적 좋 고 미끄럼 이 원활 하 며 메모리 사용량 이 낮다 코드 의 확장 성 이 매우 강하 고 4.0 버 전이 더욱 그렇다. 그러나 문 제 는 너무 복잡 해서 읽 기 가 쉽 지 않다 는 것 이다 .
하지만 일부 수요 에 부 딪 힐 수 있 습 니 다. Glide 가 만족 하지 못 합 니 다. 그림 을 불 러 오 는 최대 너비 설정 Place Holder 의 그림 모양 이 불 러 온 Bitmap 과 같 지 않 으 면 떨 리 는 문제 그림 캐 시 를 삭제 하 는 문 제 를 지정 할 수 없습니다. (signature 를 추가 하 는 방식 으로 실 효 를 시험 하고 다시 다운로드 할 수 있 지만 삭제 할 수 없습니다) 인터넷 에서 나 는 Picasso 의 그림 로드 프레임 도 보 았 다.사실 글 라 이 드 용법 과 비슷 해 요.