Android MVVM: использование Glide непосредственно во фрагменте нарушает шаблон MVVM?
Я пытаюсь следовать шаблону MVVM в новом приложении, которое сейчас пишу.
В основном он получает список элементов в JSON из моего REST-Backend и отображает его в RecycleView внутри моего фрагмента.
Я создал хранилище, которое извлекает данные и передает их в ViewModel, которая имеет LiveData, наблюдаемый фрагментом.
Это все работает отлично.
Но: у каждого предмета также есть URL для иконки. Когда список извлекается, для каждого элемента я хочу загрузить значок из этого URL в ImageView.
На самом деле я использую Glide для прямой (асинхронной) загрузки иконки в соответствующий ImageView - что хорошо для UX и производительности (на мой взгляд), так как пользователь уже видит данные, в то время как иконки загружаются в фоновом режиме
Мой вопрос:
Разрывает ли использование Glide непосредственно во фрагменте паттерн MVVM?
Какой альтернативный подход к этому?
Например, загружать значки в репозиторий, обновляя RecycleView каждый раз при извлечении значка (плохая производительность)?
3 ответа
На мой взгляд, я думаю, что это сломать MVVM, но я думаю, что все еще в порядке
Пример: если мы не используем какую-либо библиотеку для загрузки изображения из URL-адреса, мы создадим функцию для получения растрового изображения из URL-адреса (например, ImageRepository#getImageBitmap(url)
), после того как мы получим растровое изображение, мы будем использовать его для отображения в ImageView
,
Зачем getImageBitmap(url)
должен быть внутри Repository
? // потому что он получает данные с сервера
Тем не мение, image loading library
обрабатывать все для нас, и он поддерживает много замечательных вещей, а также загрузку изображения из URL - это просто небольшая задача (и нам не нужно проверять это, если мы используем библиотеку). Поэтому я думаю, что мы можем загрузить изображение внутри View
(Activity
,Fragment
,...) чтобы сделать кодирование проще без каких-либо проблем.
Если мы используем другой подход (например, ваш подход), код станет более сложным, а также нам потребуется больше времени для тестирования.
Это только мое мнение, надеюсь, это поможет
Вы можете использовать BindingAdapters, чтобы установить изображение из самого XML. Я думаю, что это гораздо более чистый подход, так что изменения, связанные с пользовательским интерфейсом, идут вместе с XML
@BindingAdapter("imageUrl")
fun setImageUrl(imageView: ImageView, url: String?) {
GlideApp.with(imageView)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView)
}
Загрузка изображения - это то, что называется "детализация низкого уровня". Другими словами, это то, что архитектура не должна заботиться. Следовательно, если вы используете Glide или Picasso, это не имеет отношения к архитектуре приложения. Исходя из этого, ваше текущее состояние "хорошо", однако ваше предложение альтернативного способа может пересекать столько красных линий. Пролистайте Чистую архитектуру дяди Боба для более подробной информации.