【问题标题】:How to execute an initial query that is not affected by the the configuration changes如何执行不受配置更改影响的初始查询
【发布时间】:2020-01-28 05:36:16
【问题描述】:

我需要在 dagger2 使用 ViewModelProvider.Factory 注入的 ViewModel 中执行初始查询,我可以在片段中执行此操作,但在这种情况下,当旋转屏幕时,将重新创建活动并且初始查询将再次执行,我不希望这种行为,我想看到我在旋转之前查看的相同数据。

可能的解决方案
我可以在 ViewModel 中定义一个布尔变量并编写这个逻辑:

_ViewModel

var isScreenRotated = true

_片段

   override fun onViewCreated(view: View, savedInstanceState: Bundle?) {

        if (searchViewModel.isScreenRotated) {
            searchViewModel.isScreenRotated = false
            searchViewModel.executeSearch("fruits", 1)
        }

    }

提前致谢。

【问题讨论】:

  • 到目前为止您尝试过什么?请在此处发布代码,以便我们更好地了解您的需求。
  • 查看编辑后的帖子,我实际上是在问我是否能够在注入的 ViewModel 的构造函数中执行代码,因为我想在应用程序启动后立即执行初始查询,但我没有'不希望它受到配置更改的影响,所以我不想在旋转屏幕时再次执行初始查询。
  • 您不需要在viewmodel的init中执行它,只需添加一个方法并从活动或片段中调用。如果您在应用程序级别需要它,那就另当别论了。
  • @DevMike01,我正在考虑它我绝对不能在 ViewModel 的构造函数中执行初始查询,因为我必须在查询中使用 ViewModel 本身,所以唯一的方法是我在问题中写的一个。
  • @cutiko 但在这种情况下,该方法将在旋转屏幕后再次调用并执行,因为将重新创建活动。

标签: android mvvm constructor viewmodel dagger-2


【解决方案1】:

旋转屏幕时,将重新创建 Activity,并再次执行初始查询,我不希望出现这种行为,我希望看到与旋转前相同的数据。

这就是 Room 为您提供 LiveData<List<T>> 的原因,您可以将其存储在您的 ViewModel 中,以便在重新订阅时不会重新获取数据。

如果数据已经开始加载或已经加载,如果它不触发重新加载,您不需要关心屏幕是否旋转。

如果您需要自定义行为,请扩展 MutableLiveData 并自行跟踪加载状态(如果您尚未开始加载,请在 onActive 中开始加载)。

【讨论】:

  • 谢谢,这绝对是真的,但我想你不明白我想要做什么我试图在应用程序第一次启动时执行初始查询,所以我希望用户看到列表在一开始的照片,然后用户可以搜索他们想要的任何类别,这个查询被写在片段中,旋转屏幕后,onViewCreated 将被再次调用,导致再次执行初始查询。所以我在问题中写的可能的解决方案不是最好的,但它有效。
  • 这就是为什么不是在onCreateView 中触发数据加载,而是在MutableLiveData.onActive 中触发它,这将通过开始观察它来触发,但如果它已经加载,假设它不会再次触发LiveData 保存在 ViewModel 中。我想你只是没有理解我的回答。 ://
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-11-20
  • 2013-05-09
  • 2010-11-08
  • 1970-01-01
  • 2023-01-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多