我正在尝试在当前编写的新应用程序中遵循MVVM模式。
基本上,它从我的REST后端获取JSON中的项目列表,并将其显示在我的片段中的RecycleView中。
我创建了一个存储库,它获取数据并将其移交给ViewModel,ViewModel具有片段所观察到的LiveData。
这一切都很好。
但是:每个项目都有一个图标的url。当列表被提取时,对于每一个项目,我都想将该url中的图标加载到ImageView中。
事实上,我使用Glide直接(异步(将图标加载到相应的ImageView中,这对用户体验和性能(在我看来(都有好处,因为当图标加载到后台时,用户已经看到了数据
我的问题:
在片段中直接使用Glide是否会打破MVVM模式?
有什么替代方法?
例如,在存储库中加载图标,每次提取图标时更新RecycleView(性能不佳(?
在我看来,我认为它打破了MVVM,但我认为它仍然可以
示例:如果我们不使用任何库从url加载图像,我们将创建一个函数从url获取位图(如ImageRepository#getImageBitmap(url)
(,在我们收到位图后,我们将使用它显示到ImageView
中
为什么getImageBitmap(url)
应该在Repository
内部?//因为它从服务器获取数据
然而,image loading library
为我们处理了所有这些,它支持许多伟大的事情,而且从url加载图像只是一个小任务(如果我们使用库,我们不需要测试它(。因此,我认为我们可以在View
(Activity
、Fragment
…(中加载图像,使编码更容易,而不会出现任何问题
如果我们使用另一种方法(如您的方法(,代码将变得更加复杂,而且我们需要更多的时间进行测试。
这只是我的观点,希望它能帮助
您可以使用BindingAdapters从XML本身设置图像。我认为这是一种更干净的方法,因此与UI相关的更改可以在XML内部进行
@BindingAdapter("imageUrl")
fun setImageUrl(imageView: ImageView, url: String?) {
GlideApp.with(imageView)
.load(url)
.diskCacheStrategy(DiskCacheStrategy.ALL)
.into(imageView)
}
加载图像被称为"低级别细节"。换句话说,这是建筑学不应该关心的事情。因此,如果你使用Glide或Picasso,它与应用程序的建筑无关。基于此,你目前的状态是"可以"的,然而你对另一种做事方式的建议可能会跨越这么多红线。浏览鲍勃叔叔的清洁建筑了解更多细节。