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

Universal Image Loader: Story, Architecture, FAQ

Embed Size (px)

DESCRIPTION

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)

Citation preview

Page 1: Universal Image Loader: Story, Architecture, FAQ

Universal Image Loader

Story, Architecture, FAQ

Sergey Tarasevich@nostra13

Page 2: Universal Image Loader: Story, Architecture, FAQ

Who’s this man?

Sergey Tarasevich (@nostra13)

• Android developer at CactusSoft

• Author of Universal Image Loader

• Certified Java SE 7 Programmer

Page 3: Universal Image Loader: Story, Architecture, FAQ

Story

Page 4: Universal Image Loader: Story, Architecture, FAQ

Chronology

27.11.2011 – First commit on GitHub

08.12.2011 – Article on Habrahabr.ru

09.02.2012 – Versioning

19.01.2013 – Mavenizing

03.2013 – 1000

07.2013 – 2000

10.2013 – 3000

03.2014 – 4000

06.2014 – 5000

10.2014 – 6000

Page 5: Universal Image Loader: Story, Architecture, FAQ

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

Page 6: Universal Image Loader: Story, Architecture, FAQ

Architecture

Page 7: Universal Image Loader: Story, Architecture, FAQ

Modules

ImageLoader

ImageDownloader

ImageDecoder

MemoryCache

DiskCache

Page 8: Universal Image Loader: Story, Architecture, FAQ

API

ImageLoaderConfiguration

DisplayImageOptions

ImageLoader

• displayImage(…)

• loadImage(…)

• loadImageSync(…)

Page 9: Universal Image Loader: Story, Architecture, FAQ

API

• ImageAware

• MemoryCache

• DiskCache

• FileNameGenerator

• ImageDownloader

• ImageDecoder

• BitmapProcessor

• BitmapDisplayer

Page 10: Universal Image Loader: Story, Architecture, FAQ

ImageAware

• getId() : int

• getWidth() : int

• getHeight() : int

• getScaleType() : ViewScaleType

• getWrappedView() : View

• isCollected() : boolean

• setImageDrawable(Drawable drawable) : boolean

• setImageBitmap(Bitmap bitmap) : boolean

Page 11: Universal Image Loader: Story, Architecture, FAQ

Task flow

Page 12: Universal Image Loader: Story, Architecture, FAQ

Disk cache

Page 13: Universal Image Loader: Story, Architecture, FAQ

Memory cache

Weak Strong

Weak&Strong

Page 14: Universal Image Loader: Story, Architecture, FAQ

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+

Page 15: Universal Image Loader: Story, Architecture, FAQ

So…

Page 16: Universal Image Loader: Story, Architecture, FAQ

Why soslow?

Page 17: Universal Image Loader: Story, Architecture, FAQ

No tests?

Page 18: Universal Image Loader: Story, Architecture, FAQ

Singleton?

Page 19: Universal Image Loader: Story, Architecture, FAQ

OutOfMemoryError

Page 20: Universal Image Loader: Story, Architecture, FAQ

OutOfMemoryError

• .bitmapConfig(Bitmap.Config.RGB_565)

• .imageScaleType(ImageScaleType.EXACTLY)

• .threadPoolSize(...) // 1 – 5

• .diskCacheExtraOptions(480, 320, null)

• .cacheInMemory(false)

MemoryAnalyzer

Still OOM

Page 21: Universal Image Loader: Story, Architecture, FAQ

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

Page 22: Universal Image Loader: Story, Architecture, FAQ

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

_666x13

_666x13

_666x13

Page 23: Universal Image Loader: Story, Architecture, FAQ

“How to display images from JSON!?

Not Constants!”

Page 24: Universal Image Loader: Story, Architecture, FAQ

Alternatives?

Page 25: Universal Image Loader: Story, Architecture, FAQ

UIL vs Picasso

Page 26: Universal Image Loader: Story, Architecture, FAQ

Questions?

Page 27: Universal Image Loader: Story, Architecture, FAQ

Thanks!