Android MVVM: использование Glide непосредственно во фрагменте нарушает шаблон MVVM? - PullRequest
0 голосов
/ 22 ноября 2018

Я пытаюсь следовать шаблону MVVM в новом приложении, которое я сейчас пишу.

По сути, он получает список элементов в JSON из моего REST-Backend и отображает его в RecycleView внутри моегофрагмент.

Я создал хранилище, которое извлекает данные и передает их в ViewModel с LiveData, наблюдаемой фрагментом.

Это все работает нормально.

Но: У каждого предмета также есть ссылка на иконку.Когда список извлекается, для каждого элемента, который я хочу загрузить значок из этого URL в ImageView.

На самом деле я использую Glide для прямой (асинхронной) загрузки значка в соответствующий ImageView - что хорошо дляUX и производительность (на мой взгляд), поскольку пользователь уже видит данные, а значки загружаются в фоновом режиме

Мой вопрос:

Разбивает ли использование Glide непосредственно во фрагменте шаблон MVVM?

Какой альтернативный подход к этому?

Например, загружать значки в репозиторий, обновляя RecycleView при каждом получении значка (плохая производительность)?

Ответы [ 3 ]

0 голосов
/ 22 ноября 2018

По-моему, я думаю, что это нарушает MVVM, но я думаю, что все в порядке

Пример: если мы не используем какую-либо библиотеку для загрузки изображения из URL, мы создадим функцию для получения растрового изображения изURL (например, ImageRepository#getImageBitmap(url)), после получения растрового изображения мы будем использовать его для отображения в ImageView.
Почему getImageBitmap(url) должно быть внутри Repository?// потому что он получает данные с сервера

Тем не менее, image loading library обрабатывает все для нас, и он поддерживает много замечательных вещей, а также загрузку изображения из URL просто небольшая задача (и нам не нужно проверять это, еслимы используем библиотеку).Поэтому я думаю, что мы можем загрузить изображение внутри View (Activity, Fragment, ...), чтобы упростить кодирование без каких-либо проблем.
Если мы используем другой подход (например, ваш подход), код станетболее сложный, а также нам нужно больше времени для тестирования.

Это только мое мнение, надеюсь, это поможет

0 голосов
/ 22 ноября 2018

вы можете использовать BindingAdapters, чтобы установить изображение из самого XML.Я думаю, что это гораздо более чистый подход, так что изменения, связанные с пользовательским интерфейсом, связаны с XML

 @BindingAdapter("imageUrl")
 fun setImageUrl(imageView: ImageView, url: String?) {
    GlideApp.with(imageView)
    .load(url)
    .diskCacheStrategy(DiskCacheStrategy.ALL)
    .into(imageView)

}

0 голосов
/ 22 ноября 2018

Загрузка изображения - это то, что называется «детализация низкого уровня».Другими словами, это то, что архитектура не должна заботиться.Следовательно, если вы используете Glide или Picasso, это не имеет отношения к архитектуре приложения.Исходя из этого, ваше текущее состояние «в порядке», однако ваше предложение альтернативного способа действий может пересекать так много красных линий.Прочитайте «Чистую архитектуру дяди Боба» для получения более подробной информации.

...