Universal Image Loader: Story, Architecture, FAQ

nostra13 1,421 views 27 slides Jun 29, 2014
Slide 1
Slide 1 of 27
Slide 1
1
Slide 2
2
Slide 3
3
Slide 4
4
Slide 5
5
Slide 6
6
Slide 7
7
Slide 8
8
Slide 9
9
Slide 10
10
Slide 11
11
Slide 12
12
Slide 13
13
Slide 14
14
Slide 15
15
Slide 16
16
Slide 17
17
Slide 18
18
Slide 19
19
Slide 20
20
Slide 21
21
Slide 22
22
Slide 23
23
Slide 24
24
Slide 25
25
Slide 26
26
Slide 27
27

About This Presentation

Presentation of Android library - Universal Image Loader.
Presented on:
- MobileOptimized 2014 conference in Minsk, Belarus (29.06.2014)
- Mobilization 4 conference in Lodz, Poland (18.10.2014)


Slide Content

Universal Image Loader Story, Architecture, FAQ Sergey Tarasevich @nostra13

Who’s this man? Sergey Tarasevich (@nostra13) Android developer at CactusSoft Author of Universal Image Loader Certified Java SE 7 Programmer

Story

Chronology 27.11.2011 – First commit on GitHub 08.12.2011 – Article on Habrahabr.ru 09.02.2012 – Versioning 19.01.2013 – Mavenizing 3 .2013 –  1000 07.2013 –  2000 10.2013 –  3000 03.2014 –  4000 06.2014 –  5000 10.2014 – 6 000

Statistics #1 Android image loading lib on GitHub #3 Android lib on GitHub #5 Java repo on GitHub #27 Android lib (appbrain.com) 3.09% of installs

Architecture

Modules Image Loader Image Downloader Image Decoder Memory Cache Disk Cache

API ImageLoaderConfiguration DisplayImageOptions ImageLoader displayImage ( … ) loadImage ( … ) loadImageSync ( … )

API ImageAware MemoryCache DiskCache FileNameGenerator ImageDownloader ImageDecoder BitmapProcessor BitmapDisplayer

ImageAware getId () : int getWidth () : int getHeight () : int getScaleType () : ViewScaleType getWrappedView () : View isCollected () : boolean setImageDrawable ( Drawable drawable ) : boolean setImageBitmap (Bitmap bitmap ) : boolean

Task flow

Disk cache

Memory cache Weak Strong Weak&Strong

ImageScaleType Source image size: 4000x3000 Target view size: 280x280 ImageScaleType Result bmp size NONE 4000x3000 NONE_SAFE 2000x1500 /2 IN_SAMPLE_POWER_OF_2 500x375 /8 (2 ³) IN_SAMPLE_INT 400x300 /10 EXACTLY 374x280 /10+ EXACTLY_STRETCHED 374x280 /10+

So…

Why so slow?

No tests?

Singleton?

OutOfMemoryError

OutOfMemoryError . bitmapConfig (Bitmap.Config.RGB_565 ) . imageScaleType ( ImageScaleType.EXACTLY ) . threadPoolSize (...) // 1 – 5 . diskCacheExtraOptions (480, 320, null) . cacheInMemory (false) MemoryAnalyzer Still OOM

« ImageAware is reused for another image. Task is cancelled [http://…] »

« …[http://v.ad/image.png_666x13] » _666x13 _666x13 _666x13

“How to display images from JSON!? Not Constants!”

Alternatives?

UIL vs Picasso

Questions?

Thanks!