gpt4 book ai didi

Android ViewModel 设计/架构

转载 作者:太空狗 更新时间:2023-10-29 13:47:50 25 4
gpt4 key购买 nike

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

主要 Activity (电影列表)

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

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

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

播放器 Activity

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

private val selectedMovie = MutableLiveData<Movie>()

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

截图 Activity

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

问题

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

最佳答案

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>>()中了, 你为什么不直接传递选定的 MoviePlayerActivity

另请注意,我不建议您使用相同的 ViewModel对于几个 Activity 。每个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有一些不错的ObserverPattern ,我在我的应用程序中经常使用它。查看此类:NotificationCenter.java .这允许 Activity订阅事件。如果另一个方法调用 event所有订阅者都会被触发。这可以帮助您“通知” Activity 做一些工作。您可以浏览存储库以了解如何使用它。

基本上,当您想收听 events 时在你的Activity , 你需要实现 NotificationCenter.NotificationCenterDelegate .然后覆盖 didReceivedNotification(int id, Object... args) , 和 (un) 订阅 events像这样:

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

然后就可以通知订阅了Activities任何地方通过电话:

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

关于Android ViewModel 设计/架构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51416807/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com