安卓MVVM:在Fragment中直接使用Glide是否破坏了MVVM模式?

7

我正在尝试遵循MVVM模式来编写一个新的应用程序。

基本上,它从我的REST后端获取JSON格式的项目列表,并在我的片段中显示RecycleView。

我创建了一个存储库,它获取数据并将其交给ViewModel,该ViewModel具有LiveData,由片段观察。

这一切都很好地运作。

但是:每个项目还有一个图标url。当获取列表时,对于每个项目,我希望将该url的图标加载到ImageView中。

实际上,我正在使用Glide直接(异步)将图标加载到相应的ImageView中 - 这对于UX和性能(在我看来)非常好,因为用户在图标在后台加载时已经看到数据。

我的问题:

在片段中直接使用Glide是否会破坏MVVM模式?

有没有其他替代方法?

例如,在存储库中加载图标,每次获取图标时更新RecycleView(性能差)?


只是建议我会怎么做,将具有此Glide逻辑的方法放在ViewModel中,并通过向其传递ImageView来从片段调用它。 - Jeel Vankhede
2
在我看来,在MVVM架构中最好使用DataBinding和Glide。 - Ümañg ßürmån
我认为这没问题,因为它是视图逻辑。 - NIKHIL MAURYA
3个回答

2

您可以使用BindingAdapters从XML中设置图像。我认为这是一种更加清晰的方法,使得UI相关的更改在XML内部进行。

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

2
在我看来,我认为这违反了MVVM模式,但我认为这还可以接受。
例如:如果我们不使用任何库来从URL加载图像,我们将创建一个函数来从URL获取位图(如),在接收到位图后,我们将使用它显示到中。为什么应该在中?因为它从服务器获取数据。
然而,图像加载库为我们处理了一切,并且它支持许多出色的功能,同时从URL加载图像只是一个小任务(如果我们使用库,则无需测试它)。因此,我认为我们可以在<视图>(<活动>、<片段>等)中加载图像,以便编码更加容易,没有任何问题。如果我们使用其他方法(如您的方法),代码将变得更加复杂,并且我们需要更多时间进行测试。
这只是我的观点,希望它有所帮助。

为什么getImageBitmap(url)应该在Repository中?因为它从服务器获取数据。但这是数据访问,我认为这是DAO的责任。 - Arash

1
加载图片是一种称为“低级细节”的东西。换句话说,这不是架构需要关心的事情。因此,如果您使用Glide或Picasso,它与应用程序的架构无关。基于此,您当前的状态是“可以的”,但是您提出的替代方法建议可能会越过许多红线。请查阅Uncle Bob的《Clean Architecture》以获取更多详细信息。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接