Introducing Glide

Android image loader

Presented by Alan Jeon | @skyisle

Who am I?

  • 前 GDG Android
    Korea 운영진
  • SK planet
  • 예쁜 지아 아빠

iosched

iosched

구글 I/O 앱, 안드로이드 팀이 최신 API나 디자인 패턴들을 적용. https://github.com/google/iosched

iosched - 이미지 로더

이 앱에서 사용되어온 이미지 로더 패턴에 대해 한번 알아봅시다.

iosched 2011


BitmapUtils.fetchImage(getActivity(), speakerImageUrl, null, null,
	new BitmapUtils.OnFetchCompleteListener() {
	  	public void onFetchComplete(Object cookie, Bitmap result) {
	      	if (result != null) {
	          	speakerImgView.setImageBitmap(result);
	      	}
	  	}
	});
					

AsyncTask 안에서 다운로드, 캐시, 디코딩을 다 처리함


public static void fetchImage(final Context context, final String url,
	final BitmapFactory.Options decodeOptions,
	final Object cookie, final OnFetchCompleteListener callback) {
	new AsyncTask<String, Void, Bitmap>() {
	    @Override
	    protected Bitmap doInBackground(String... params) {
	        final String url = params[0];
	        if (TextUtils.isEmpty(url)) {
	            return null;
	        }
						
Link!

안드로이드 개발자 문서 Training

Displaying Bitmaps Efficiently

  • BitmapFactory.Options 로 디코딩시 이미지 사이즈 조정해서 디코딩
  • 백그라운드 스레드에서 디코딩
  • 메모리 캐시 사용하기
  • 설정변경(회전) 대응하기
  • 메모리 관리

iosched 2012


private Bitmap processNormalBitmap(String urlString) {
    final String key = ImageCache.hashKeyForDisk(urlString);
    FileDescriptor fileDescriptor = null;
    FileInputStream fileInputStream = null;
    DiskLruCache.Snapshot snapshot;
    synchronized (mHttpDiskCacheLock) {
        // Wait for disk cache to initialize
        while (mHttpDiskCacheStarting) {
            try {
                mHttpDiskCacheLock.wait();
            } catch (InterruptedException e) {}
        }

        if (mHttpDiskCache != null) {
            try {
					

ImageFetcher 모듈화, DiskLruCache 사용, HttpURLConnection 사용

Link!

iosched 2013

Volley 의 등장

Volley

  • 강력한 네트워크 라이브러리
  • 재시도 정책 지정 가능
  • 손쉬운 캐싱
  • 요청 취소 기능
  • 다중 접속 관리
  • URL 이미지 로딩기능 제공

I/O 2013 Volley 세션

  • 성능에 자신감
  • 모든 Http 라이브러리보다 빠르다!
  • 최대 10배! 우리가 짱임
  • 구글의 노하우가 녹아 있다고~ 안쓰면 손해임

믿고 쓰라고 해서 썼으나.....

Down arrow

Down arrow

Down arrow
Down arrow

  • 릴리즈 프로세스 없음
  • 이슈관리 안됨
  • 사용법 정리 안됨

.........(긴 한숨)

iosched 2014

Glide의 등장

Glide?

https://github.com/bumptech/glide

Bump! 앱을 만든 Bumptech가 구글에 인수되면서 Bump앱에서 사용하던 이미지 로딩 라이브러리를 공개!

Glide 특징

사용하기 편리한 API


Glide.with(this)
	.load("http://goo.gl/kfVV6a")
	.into(imageView);
							
용욱님 만세.

Placeholder, 애니메이션, Transfomation


Glide.with(myFragment)
	.load(url)
	.centerCrop()
	.placeholder(R.drawable.loading_spinner)
	.crossFade()
	.into(myImageView);
							

다양한 데이터 모델 지원

content://, file://, http://, android.resource:// .

Ani-gif 로딩


Glide.with(this)
	.load("http://i.imgur.com/HaouSvg.gif")
	.into(imageView);
						

비트맵 객체 재활용

Jank를 최소화 하기 위해 Bitmap 객체 재활용

Manage Memory on Android 3.0 and Higher

public static class BitmapFactory.Options {
public Bitmap inBitmap; // Added in API level 11
}
					

If set, decode methods that take the Options object will attempt to reuse this bitmap when loading content.

성능 비교

한눈에 비교

비고 Glide Picasso Volley AUIL
편리한 API YES YES NO NO
다양한 Model YES YES NO NO
Ani-Gif YES NO NO NO
Bitmap 재활용(No Jank!) YES NO NO NO

적용 방법


dependencies {
    compile 'com.github.bumptech.glide:glide:3.3.+'
    compile 'com.android.support:support-v4:21.0.0'
}

Q/A

Thank you!