Picasso - библиотека для загрузки картинок, разработанная крутыми перцами из Square Open Source.
Простой пример:
Picasso.get()
.load(url)
.into(imageView)
Разберёмся как работает:
1) Класс Picasso предоставляет API для работы с библиотекой, является Singleton'ом и содержит в себе основные компоненты, такие как: Dispatcher, список RequestHandler'ов, Application контекст и Handler, работающий на главном потоке для установки Bitmap в ImageView.
Немного магии: Picasso получает контекст из ContentProvider'а, зарегистрированного в манифесте библиотеки, если интересно гляньте код PicassoProvider.
2) При вызове метода Picasso.load() возвращается объект класса RequestCreator для настройки размеров, placeholder'ов, Transformation штук, политик кэша и тд, в общем всего, что касается Bitmap'ы и её преобразований.
3) RequestCreator.into() под капотом создаёт объект класса Request и ставит в очередь обработку запроса Dispatcher'у, если результат такого запроса ещё не был сохранён в memory кэш.
Dispatcher - внутренний класс библиотеки, отвечающий за обработку пачки запросов от Picasso.load(), выполняется на своём потоке и имеет свой Looper с Handler'ом, такая реализация удобна для обработки групп запросов.
4) Dispatcher обрабатывает запрос на отдельно выделенном пуле потоков PicassoExecutorService, дополнительно оборачивая его в BitmapHunter, который получает Bitmap'у от одного из RequestHandler'ов и пропускает через трансформации, если они были указаны.
RequestHandler - это обёртка над одним из источников Bitmap: ресурсы, assets, сеть и тд.
5) После того, как BitmapHunter получил и обработал Bitmap'у, результат обратно возвращается в Dispatcher, который передаёт его Handler'у из Picasso класса, где происходит установка Bitmap в ImageView через ImageViewAction, наследник от Action.
Класс Action абстрагирует способ обработки результата запроса.
Пишите в комментах ваше мнение и всем хорошего кода!
