问题标签 [android-viewmodel]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
android - AndroidViewModel 与 ViewModel
随着 Android 架构组件库的引入,引入了几个新类,包括AndroidViewModel
和ViewModel
. 但是,我无法弄清楚这两个类之间的区别。该文档简洁地描述AndroidViewModel
如下:
应用程序上下文感知
ViewModel
我很欣赏简洁,但这究竟意味着什么?我们什么时候应该选择使用AndroidViewModel
over ViewModel
,反之亦然?
android - ViewModel 能否在 Activity 保存和恢复中存活?
ViewModel
如果以下列方式使用,新类的实例可以在配置更改后继续存在:
但是,除了配置更改之外,还有一个保存-恢复的场景,即整个应用程序的进程都被杀死了。
ViewModel
在保存-恢复场景中会保留里面的字段值吗?
编辑:基于这个问题的答案,我写了这篇文章:Android ViewModel Architecture Component is Dangerous
android - Android LiveData 修改问题
我想使用 Android 新架构组件在我的 Android 应用程序中显示产品列表。我有一个 Pojo 类Products
,如下所示:
网络服务返回带有分页的列表:
所以每次产品列表调用,我都会得到一组带有其他数据的产品列表。我已经定义了调用相同的方法ProductListRepository
:
但是我在设置 LiveData 时遇到了问题,ProductViewModel
因为我想将 ListProductDetails
与较旧的 List 合并,并更新其他变量的值,Products
如onSaleCount
, pageNo
。
}
谁能帮我?
android - 安卓:视图模型。调用观察者方法失败
我正在使用新的拱门。来自谷歌的组件。
我在 Activity Login/Registering Fragments 中管理多亏了FragmentTransaction
Activity->RegisterFragment (with ViewPager) -> RegistrationSteps (adapter)
在 RegisterFragment 里面我有 ViewPager。我希望里面的所有页面ViewPager
都使用相同的 ViewModel。
这些是注册步骤 ( RegistrationStepFragment
),它采用父RegistrationFragment
LifecycleOwner将ViewModel限定为它——我只是希望 ViewModel 被限定为这个父 Fragment。
RegistrationFragment.class继承自
继承自的注册步骤(页面)
一切顺利,直到我到达 3 页,我想移回(到第二页)然后在mViewPager.setCurrentItem(1)
(第 2 页:索引:1)中抛出异常
编辑
好的,我发现当移动到上一页时,片段被重新创建调用并mViewModel.observable()
收到先前的成功消息并导致 viewpager 向前移动,这导致破坏刚刚创建的片段导致错误。
解决方案是创建仅在调用 post 时才发出值的SingleEventLiveData(如果值在观察者附加之前发生更改,则不要通知观察者)
我将其标记为关闭
android - 在 ViewModel 中更改 LiveData 以“重做”工作
所以,我刚刚开始尝试LiveData
- 我正忙于一个新项目,我正在使用的地方ViewModel
以及LiveData
-RESTFul
我用来获取数据的一些服务,它们不带参数并返回一些数据。
MVVM 范例的典型设置LiveData
如下所示:
现在,当我们离开这个活动,去一个新的活动,通过使用意图或其他方式,而不是按下后退按钮(所以,finalize
没有被调用) - 然后回到MyActivity
- 我们当然不获取users
再次,因为我们仍然应该拥有该数据。
但是,如果我们确实想再次获取它们怎么办?
从我所看到的来看,正确执行此操作的唯一方法似乎是在getUsers()
LiveData
对象上调用“setValue”
像这样的东西:
ViewModel
看起来像这样:
我决定这样做的一个原因是因为谷歌不希望我们这样做:
为此原因:
如果这是实现,则 UI 需要在每次调用 getPostalCode() 时从以前的 LiveData 中注销并重新注册到新实例。此外,如果重新创建 UI,它会触发对 repository.getPostCode() 的另一个调用,而不是使用先前调用的结果。
有没有更好的方法来ViewModel
“重做”它的repo.getUsers()
调用?也许我可以创建一个方法,说“Update()”而不是“活动”,但仍然 - 它以不同的方式做同样的事情。
android - Android架构组件和LiveData,太多的MutableLiveData对象?
在 android 架构组件发布之前,我开始从事一个项目,我拥有自己的 ViewModel,它与 Fragment 具有相同的生命周期,并且 ViewModel 状态保存在 Loader 内的 StateObject 中,以便状态可以在方向变化后继续存在。ViewModel 通过接口与 Fragment 通信。这很好用,因为 ViewModel 和 Fragment 具有相同的生命周期。我的 ViewModel 包含各种状态。它有一个 isLoading 布尔值、isEmptyStateVisible 布尔值等。每次状态发生变化时,我都会调用 view.notifyIsLoadingChanged(true/false) 之类的东西,在这种情况下,Fragment 会显示或隐藏一个微调器。
现在我将更改我的实现以将新的 ViewModel 与 LiveData 一起使用。实现 LiveData 的最快方法是更改 ViewModel 正在使用的 UI 界面的实现。所以我可以保留我当前的实现,只添加这个 UI 接口实现:
此类扩展的 LiveDataUI 类具有更多方法,例如:
有了这个实现,我最终会得到很多 MutableLiveData 对象,而且感觉不对。我是否在我的 ViewModel 中投入了太多的状态?我的想法是将所有逻辑都包含在 ViewModel 中,这样我就可以编写测试来验证在加载数据时 isLoading 是否为真,如果 Api 没有返回数据,则 isEmptyState 为真等。
我还注意到,如果我调用 setValue(state); 在同一个 MutableLiveData 对象上很短的时间内多次,onChanged 方法只被调用一次。那是对的吗?
android - 了解Android架构组件示例GithubBrowserSample:ViewModelModule、ViewModel参数
涵盖 Android 架构组件的最新示例之一是Google 提供的GithubBrowserSample。我查看了代码并提出了一些问题:
我注意到ViewModelModule包含在AppModule中。这意味着所有视图模型都添加到 DI 图中。为什么以这种方式完成,而不是
Module
为每个 Activity/Fragment 单独提供仅提供ViewModel
特定 Activity/Fragment 所需的?在这个特定的示例中,使用GithubViewModelFactory实例化视图模型有没有办法将参数传递给特定的
ViewModel
?或者更好的解决方案是创建一个 setterViewModel
并通过 setter 设置所需的参数?
android - 在 Android ViewModel 中使用 AsyncTask 可以吗?
AsyncTask 对于数据库请求等后台作业是否安全,还是会出现内存泄漏等问题?在 ViewModel 中使用安全吗?
android - 从 ViewModel 访问 strings.xml
我正在使用Dagger 2 DataBindng
新的 Android 生命周期组件,它们具有ViewModels
.
在我的内部我ViewModel
怎么能访问我的strings.xml?起初我在想,将 aContext
注入viewModel
,但是,这只会泄漏内存。
还有其他方法吗?
android - 从 ViewModel 执行网络操作
我正在使用 IO/17 中引入的 ViewModel。
我正在使用 android 开发人员页面上提供的以下指南。 https://developer.android.com/topic/libraries/architecture/viewmodel.html
以下是他们的示例代码。
我希望在“ loadUsers() ”方法中执行 Volley 请求。但我不能这样做,因为它需要一个“上下文”,如下所示
所以我的问题是,
- 是否建议(或可能)在 ViewModel 中执行网络操作?
- 如果是(如果可能),该怎么做?