Universal image loader android

Универсальный ImageLoader для Android

В этой статье Я расскажу о разработанном мной (и не только) инструменте для асинхронной подгрузки изображений, их кэширования и отображения. На данном этапе развития его можно использовать повсеместно, где надо загрузить картинку в ImageView из интернета или из файловой системы. Все, что нужно, это URL картинки (для файловой системы он будет начинаться на «file://») и собственно ImageView, в который загруженную картинку надо будет положить. Более подробно о возможностях универсального разработанного ImageLoader‘а читайте ниже. Началось все в одном проекте, в котором мне довелось учавствовать: необходимо было реализовать просмотр новостей списком.И тут конечно встал вопрос об отображении картинок в элементах списка. Картинки подгружались из интернета, поэтому надо было реализовать их асинхронную подгрузку, отображение и кэширование. Беглый поиск в сети навел меня на следующее почти готовое решение данной задачи. Реализованный LazyImageLoader асинхронно загружал картинки из интернета, кэшировал их в файловой системе, а также хранил их в памяти. Способ хранения в памяти представлял собой простой HashMap без каких-либо слабых ссылок, в результате чего на определенном этапе прокрутки списка (а списков к тому же было много) стал вылетать OutOfMemoryError. HashMap был заменен на WeakValueHashMap, а затем на собственную реализацию Map с ограничением на использование памяти.Постепенно, на базе этого LazyImageLoader’а стал вырастать собственный ImageLoader со своими фишечками и рюшечками. Его можно было использовать для отображения картинок не только в списках, но и в галерее, и для простого «одноразового» отображения. Этот ImageLoader был в дальнейшем переиспользован в двух других проектах, что подтвердило его состоятельность. Значительно отрефакторив существующий код и наведя приемлемую красоту, Я выложил исходники на GitHub, где сейчас постепенно ведется дальнейшая оптимизация интсрумента, повышение гибкости и настраиваемости.Итак, что все таки может этот ImageLoader?Отображать картинки — это ясно. Что насчет кэширования?Кэширование разделено на:

  • кэширование в памяти
  • кэширование на файловой системе (память телефона или SD-карта)

В роли кэша в памяти выступает HashMap со «слабыми» ссылками в значениях. Насколько «слабыми» (Soft, Weak, Phantom) — решать вам:В текущей версии используется кэш Bitmap’ов, контролирующий свой размер. Это было реализовано посредством введения дополнительного «жесткого» списка, где хранились «сильные» ссылки на Bitmap’ы из softMap’ы. Как только размер кэша превышает допустимый лимит, «самые старые» объекты удаляются из «жесткого списка», тем самым теряя сильную ссылку. Слабая ссылка все ещё сохраняется в softMap’e, но там Bitmap уже полностью во власти Garbage Collector’a.При кэшировании на файловой системе файлы именуются как imageUrl.hashCode() и в дальнейшем по такому же принципу проводится поиск в кэше.Рассмотрим самый полнофункциональный метод ImageLoader’а — это:Параметры imageUrl и imageView, Я думаю, вопросов не вызовут.Класс DisplayImageOptions предназначен для настройки процесса загрузки, кэширования и отображения картинки. С помощью него можно указать:

  • надо ли отображать картинку-заглушку в ImageView, пока загружается реальная картинка, и какую именно заглушку отображать;
  • надо ли кэшировать загруженную картинку в памяти;
  • надо ли кэшировать загруженную картинку на файловой системе.
Читайте также:  Защита базы от зомби для андроид

Интерфейс ImageLoadingListener позволяет «слушать» процесс загрузки изображения:Но если текущая картинка присутствует в кэше в памяти, то listener не будет бросать события. События бросаются на UI-потоке, так что можно со спокойной душой трогать UI в listener’e.Итак, пример использования ImageLoader’a:Сильно распространяться про сам механизм работы ImageLoader’а не буду. Скажу только пару вещей:

  • задания на отображение картинки кладутся в очередь: если картинка уже есть в кэше на файловой системе, задание попадает на начало очереди, если нет — в конец. Задания выполняются с начала очереди, тем самым отображая в первую очередь закэшированные картинки; (UPD: После введения многопоточного механизма отображения картинок данная логика была упразднена. Теперь загрузкой закэшированных и незакэшированный изображений занимаются два разных пула потоков: для закэшированных — однопоточный, для остальных — многопоточный)
  • в кэше в памяти хранятся не полноразмерные Bitmap’ы, а размера не менее того, который нужен для отображения в ImageView. Этот размер вычисляется, исходя из атрибутов maxWidth и maxHeight, layout_width и layout_height, размеров экрана аппарата (размер исходной картинки уменьшается на степень двойки, в соответствии с рекомендациями по декодированию изображений).
  • т.к. в первую очередь ImageLoader предназначается для отображения картинок в списке, а в списках, как правило, хорошим тоном являтся переиспользование View, то и ImageLoader отслеживает такие ситуации, сохраняя загружаемый URL картинки в Tag ImageView с собственным ключом.

Ещё раз дам ссылку на исходники на GitHub.Надеюсь данный ImageLoader пригодится и Вам.

UPD (19.12.2011): В инструмент были внесены некторые существенные изменения, подробно о них и о проекте в целом можно прочитать здесь.
UPD (23.02.2012): Была сделана куча изменений и улучшений (в т.ч. многопоточность, внешнее конфигурирование). Но основное API в принципе все то же. Теперь инструмент доступен в качетве jar-ки. Введена версионность.
UPD (11.03.2012): Написал подробное руководство по использованию библиотеки:

  • Universal Image Loader. Часть 1 — Введение
  • Universal Image Loader. Часть 2 — Конфигурация
  • Universal Image Loader. Часть 3 — Использование

Источник

babafall / Android-Universal-Image-Loader Go PK Goto Github PK

Powerful and flexible library for loading, caching and displaying images on Android.

License: Apache License 2.0

Android-Universal-Image-Loader’s Introduction

Universal Image Loader for Android

This project aims to provide a reusable instrument for asynchronous image loading, caching and displaying. It is originally based on Fedor Vlasov’s project and has been vastly refactored and improved since then.

Upcoming changes in new UIL version (1.9.3+)

  • Implicit ImageLoader initialization (explicit configuration on start isn’t required anymore)
  • Memory Cache redesign
  • New API: DisplayImageOptions.targetSize(ImageSize)
  • HTTP cache support
  • Consider BitmapFactory.Options.inBitmap
  • ImageLoader.loadImageSync() fix
  • Multithread image loading (async or sync)
  • Wide customization of ImageLoader’s configuration (thread executors, downloader, decoder, memory and disk cache, display image options, etc.)
  • Many customization options for every display image call (stub images, caching switch, decoding options, Bitmap processing and displaying, etc.)
  • Image caching in memory and/or on disk (device’s file system or SD card)
  • Listening loading process (including downloading progress)
Читайте также:  Android sdk jdk tools

Android 2.0+ support

  • universal-image-loader-1.9.2.jar (library; contains *.class files)
  • universal-image-loader-1.9.2-sources.jar (sources; contains *.java files)
  • universal-image-loader-1.9.2-javadoc.jar (Java docs; contains *.html files)
  • universal-image-loader-1.9.2-with-sources.jar (library with sources inside; contains *.class and *.java files)
    Prefer to use this JAR so you can see Java docs in Eclipse tooltips.
  • universal-image-loader-sample-1.9.2.apk (sample application)

Latest snapshot of the library — here

Documentation (outdated, new one is in progress. )

  • Universal Image Loader. Part 1 — Introduction [RU]
  • Universal Image Loader. Part 2 — Configuration [RU]
  • Universal Image Loader. Part 3 — Usage [RU]
  1. Look into Useful Info
  2. Search problem solution on StackOverFlow
  3. Ask your own question on StackOverFlow.
    Be sure to mention following information in your question (otherwise a question may be ignored):
  • UIL version (e.g. 1.9.2)
  • Android version tested on (e.g. 2.1)
  • your configuration ( ImageLoaderConfiguration )
  • display options ( DisplayImageOptions )
  • getView() method code of your adapter (if you use it)
  • XML layout of your ImageView you load image into

Bugs and feature requests put here.
If you have some issues on migration to newer library version — be sure to ask for help here

1. Include library

Manual:

  • Download JAR
  • Put the JAR in the libs subfolder of your Android project

Maven dependency:

2. Android Manifest

3. Application class

Configuration and Display Options

  • ImageLoader Configuration ( ImageLoaderConfiguration ) is global for application.
  • Display Options ( DisplayImageOptions ) are local for every display task ( ImageLoader.displayImage(. ) ).

All options in Configuration builder are optional. Use only those you really want to customize.
See default values for config options in Java docs for every option.

Display Options can be applied to every display task ( ImageLoader.displayImage(. ) call).

Note: If Display Options wasn’t passed to ImageLoader.displayImage(. ) method then default Display Options from configuration ( ImageLoaderConfiguration.defaultDisplayImageOptions(. ) ) will be used.

Acceptable URIs examples

NOTE: Use drawable:// only if you really need it! Always consider the native way to load drawables — ImageView.setImageResource(. ) instead of using of ImageLoader .

Other useful methods and classes to consider.

Also look into more detailed Library Map

  1. Caching is NOT enabled by default. If you want loaded images will be cached in memory and/or on disk then you should enable caching in DisplayImageOptions this way:
  1. If you enabled disk caching then UIL try to cache images on external storage (/sdcard/Android/data/[package_name]/cache). If external storage is not available then images are cached on device’s filesystem. To provide caching on external storage (SD card) add following permission to AndroidManifest.xml:
  1. How UIL define Bitmap size needed for exact ImageView? It searches defined parameters:
  • Get actual measured width and height of ImageView
  • Get android:layout_width and android:layout_height parameters
  • Get android:maxWidth and/or android:maxHeight parameters
  • Get maximum width and/or height parameters from configuration ( memoryCacheExtraOptions(int, int) option)
  • Get width and/or height of device screen
Читайте также:  Яндекс такси для андроид все версии

So try to set android:layout_width | android:layout_height or android:maxWidth | android:maxHeight parameters for ImageView if you know approximate maximum size of it. It will help correctly compute Bitmap size needed for this view and save memory.

  1. If you often got OutOfMemoryError in your app using Universal Image Loader then:
  • Disable caching in memory. If OOM is still occurs then it’s a defect of your app. Otherwise try the following steps (all of them or several):
  • Reduce thread pool size in configuration ( .threadPoolSize(. ) ). 1 — 5 is recommended.
  • Use .bitmapConfig(Bitmap.Config.RGB_565) in display options. Bitmaps in RGB_565 consume 2 times less memory than in ARGB_8888.
  • Use .imageScaleType(ImageScaleType.EXACTLY)
  • Use .diskCacheExtraOptions(480, 320, null) in configuration
  1. For memory cache configuration ( ImageLoaderConfiguration.memoryCache(. ) ) you can use already prepared implementations.
  • Cache using only strong references:
    • LruMemoryCache (Least recently used bitmap is deleted when cache size limit is exceeded) — Used by default
  • Caches using weak and strong references:
    • UsingFreqLimitedMemoryCache (Least frequently used bitmap is deleted when cache size limit is exceeded)
    • LRULimitedMemoryCache (Least recently used bitmap is deleted when cache size limit is exceeded)
    • FIFOLimitedMemoryCache (FIFO rule is used for deletion when cache size limit is exceeded)
    • LargestLimitedMemoryCache (The largest bitmap is deleted when cache size limit is exceeded)
    • LimitedAgeMemoryCache (Decorator. Cached object is deleted when its age exceeds defined value)
  • Cache using only weak references:
    • WeakMemoryCache (Unlimited cache)
  1. For disk cache configuration ( ImageLoaderConfiguration.diskCache(. ) ) you can use already prepared implementations:
  • UnlimitedDiscCache (The fastest cache, doesn’t limit cache size) — Used by default
  • LruDiskCache (Cache limited by total cache size and/or by file count. If cache size exceeds specified limit then least-recently used file will be deleted)
  • LimitedAgeDiscCache (Size-unlimited cache with limited files’ lifetime. If age of cached file exceeds defined limit then it will be deleted from cache.)

NOTE: UnlimitedDiscCache is pretty faster than other limited disk cache implementations.

  1. To display bitmap ( DisplayImageOptions.displayer(. ) ) you can use already prepared implementations:
  • RoundedBitmapDisplayer (Displays bitmap with rounded corners)
  • FadeInBitmapDisplayer (Displays image with «fade in» animation)
  1. To avoid list (grid, . ) scrolling lags you can use PauseOnScrollListener :

If you see in logs some strange supplement at the end of image URL (e.g. http://anysite.com/images/image.png_230x460 ) then it doesn’t mean this URL is used in requests. This is just «URL + target size», also this is key for Bitmap in memory cache. This postfix ( _230x460 ) is NOT used in requests.

ImageLoader always keeps aspect ratio of images.

Applications using Universal Image Loader

You can support the project and thank the author for his hard work 🙂

  • PayPal — nostra.uil[at]gmail[dot]com
  • WebMoney — Z417203268219
  • GitTip — nostra13

If you use Universal Image Loader code in your application you should inform the author about it ( email: nostra13[at]gmail[dot]com ) like this:

Источник

Оцените статью