구글 I/O 앱, 안드로이드 팀이 최신 API나 디자인 패턴들을 적용. https://github.com/google/iosched
이 앱에서 사용되어온 이미지 로더 패턴에 대해 한번 알아봅시다.
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!
Displaying Bitmaps Efficiently
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!Volley 의 등장
.........(긴 한숨)
Glide의 등장
https://github.com/bumptech/glide
Bump! 앱을 만든 Bumptech가 구글에 인수되면서 Bump앱에서 사용하던 이미지 로딩 라이브러리를 공개!
Glide.with(this)
.load("http://goo.gl/kfVV6a")
.into(imageView);
Glide.with(myFragment)
.load(url)
.centerCrop()
.placeholder(R.drawable.loading_spinner)
.crossFade()
.into(myImageView);
content://, file://, http://, android.resource:// .
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'
}