3

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

主要活动(电影列表)

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

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

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

玩家活动

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

private val selectedMovie = MutableLiveData<Movie>()

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

截图活动

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

问题

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

1 回答 1

1

每次进行网络请求显然是非常浪费的,我知道我应该使用类似空间之类的东西在本地缓存这些信息。

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

在没有本地数据库的情况下,有没有更好的方法来做我上面用 ViewModels 做的事情?也许上面所有 3 个活动都可以访问一个视图模型?

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

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

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

这样做,可以直接对电影对象进行更改并在所有视图中同步吗?关于如何做到这一点的任何好例子?

好吧,应用程序Telegram有一些不错的ObserverPattern,我在我的应用程序中经常使用它。请参阅此类:NotificationCenter.java。这允许Activity订阅事件。如果另一个方法调用event所有订阅者都会被触发。这可以帮助你“通知”活动做一些工作。您可以浏览存储库以查看如何使用它。

基本上,当你想events在你ActivityNotificationCenter.NotificationCenterDelegate. 然后 override didReceivedNotification(int id, Object... args),并且 (un) 像这样订阅events

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

Activities然后,您可以通过调用通知任何地方的订阅者:

NotificationCenter.getInstance().postNotificationName(NotificationCenter.scheduleReload);
于 2018-07-19T07:59:00.727 回答