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, это не имеет отношения к архитектуре приложения. Исходя из этого, ваше текущее состояние "хорошо", однако ваше предложение альтернативного способа может пересекать столько красных линий. Пролистайте Чистую архитектуру дяди Боба для более подробной информации.

Другие вопросы по тегам