Android 视图模型 design/architecture

Android ViewModel design/architecture

我是一名 android 初学者,正在寻找有关应用架构的一些建议 - 特别是与使用 ViewModel 相关的建议。没有本地数据库,每个屏幕发出新的网络请求。稍后我会考虑实现 room 或类似的东西。

主要Activity(电影列表)

我有一个 activity 的 100% 大小的回收视图显示电影列表,recyclerview 中的每部电影都有一个封面图像,用户可以触摸该图像以导航到播放器视图。 MainActivity(及其回收者视图)由 ViewModel 提供支持。电影 object(由 LiveData 包装)包含您期望的内容,例如标题、类别、封面图片,url 到 mp4 文件。

private val movies = MutableLiveData<List<Movie>>()

为了转换到 PlayerActivity,Intent 将所选电影的 ID 作为字符串额外传递。

玩家Activity

当 MainActivity 的回收视图中的电影单元格被选中时,我创建了一个新的 intent 以转换到播放电影的 PlayerActivity。这里也有一个带有电影封面图像的 imageView。此视图也由 ViewModel 支持。

private val selectedMovie = MutableLiveData<Movie>()

在 OnCreate() 中,我从意图中获取额外的 movie_id 字符串,并创建 ViewModel(并且 ViewModel 使用 movie_id 执行网络请求)。此视图还有一个按钮,当用户触摸该按钮时,会将用户转换到屏幕截图 Activity。转换到屏幕截图的意图 Activity 还将 movie_id 作为字符串额外传递。

截图Activity

具有显示的电影屏幕截图的回收视图,触摸时,网络请求会发送回服务器以使用其中一张屏幕截图更新电影的封面图像。此 activity 从 PlayerActivity 意图中获取额外的 movie_id 来设置视图。

问题

  1. 显然每次都做一个网络请求是很浪费的,我明白我应该使用room之类的东西在本地缓存这些信息。 在没有本地数据库的情况下,有没有更好的方法来完成我在上面使用 ViewModels 所做的事情?也许一个单一的视图模型可以被上面的所有 3 个活动访问?这样做,可以直接对电影进行更改 object 并在所有视图中同步?关于如何做到这一点有什么好的例子吗?
  2. 鉴于我当前的 3x ViewModels for 3x Activity,我如何通知 MainActivity 更新屏幕截图,以及 PlayerActivity 在屏幕截图时更新封面图像(在播放器上)截图更新了Activity?

It's obviously pretty wasteful to do a network request each time, and I understand I should probably use something like room to cache this information locally.

好吧,这取决于您的网络请求的大小。它们是几兆字节吗?那么是的,我会在本地缓存一些电影图像。

In the absense of a local database, is there a better way to do what I'm doing above with ViewModels? Perhaps a single viewmodel that can be accessed by all of the 3 activities above?

嗯,我觉得你现在的做法一点也不差,我觉得我们应该看看API。在您的 MovieList 中,您获取电影的所有数据对吗?我认为那一刻你应该缩小 API 发送的数据。然后当只选择一部电影时,将截图等内容下载下来缓存到本地。如果您无法编辑 API,那么可以,我建议您下载所有需要的内容并尽可能多地重复使用。

既然您的数据已经在 private val movies = MutableLiveData<List<Movie>>() 中,您为什么不直接将选定的 Movie 传递给 PlayerActivity

另请注意,我不建议您对多个活动使用相同的 ViewModel。每个 Activity 取决于它自己。

In doing so, changes could be made directly to the movie object and syncd across all views? Any good examples on how to do this?

好吧,应用程序 Telegram has some nice ObserverPattern, I use it a lot in my apps. See this class: NotificationCenter.java。这允许 Activity 订阅事件。如果另一个方法调用 event 所有订阅者都会被触发。这可以帮助您对 'notify' 活动做一些工作。您可以浏览存储库以了解如何使用它。

基本上,当您想在 Activity 中监听 events 时,您需要实施 NotificationCenter.NotificationCenterDelegate。然后覆盖 didReceivedNotification(int id, Object... args),并(取消)订阅 events,如下所示:

NotificationCenter.getInstance().addObserver(this, NotificationCenter.scheduleReload);

然后你可以在任何地方通过调用通知订阅的Activities

NotificationCenter.getInstance().postNotificationName(NotificationCenter.scheduleReload);