【问题标题】:Android - LiveData vs WeakReferencesAndroid - LiveData 与 WeakReferences
【发布时间】:2019-07-30 01:19:25
【问题描述】:

我将建议的架构与 ViewModel 和 LiveData 一起使用。我需要从 API 中检索一些数据,所以我通过存储库来完成,然后 ViewModel 将 LiveData 暴露给 UI。

问题是对 API 的调用可能会失败,而 UI 需要对这种情况做出反应。

我已经解决了这个问题,方法是使用一个 Wrapper 类来保存我的数据以及一个可能是错误状态的状态(以及一些额外的信息)。 这行得通,但我更希望 ViewModel 管理我自己的 Listener,这样我就有了 onSuccess() 和 onError() 之类的方法。问题是我失去了 LiveData 的 Lifecyle 控制。

最近了解了WeakReference,貌似LiveData替代了WeakReferences的使用,不知道为什么会这样?使用 LiveData 而不是我自己的带有 WeakReferences 的 Listeners 有什么好处?

【问题讨论】:

  • 这是一个想法;如果您使用 Retrofit2 进行 api 调用,您可以通过 Retrofit 设置失败或成功响应并将一些布尔值从您的存储库类返回到您的视图模型。然后,您的 Activity/Fragment 可以检查此变量并相应地显示 UI。
  • 为什么要重新发明轮子。如果您想为每一件事(数据库调用、api 调用、UI 更新等)编写自己的侦听器,您可以这样做,或者您可以只使用 google 提供的架构组件...
  • @a_local_nobody 是的,你是对的,但我想问的是,如果出于某种原因我决定使用 Wea​​kReference 创建自己的侦听器,我将失去 LiveData 提供的一些非常有益的功能。也许在使用 Wea​​kReferences 的情况下,我会比使用 LiveData 更频繁地发生内存泄漏
  • 你能发布你用来传输数据和状态的包装类吗?
  • 普通回调与LiveDataRxJava 之间并没有太大的技术差异。主要区别在于设计。如果您使用LiveDataRxJava,您可以将您的 ViewModel 层与 View 层完全隔离,而如果您只使用回调,您的 View 需要以某种方式传递侦听器甚至它自己对 ViewModel 的引用,而 ViewModel 需要保留这些参考。

标签: android android-livedata weak-references


【解决方案1】:
  1. 它基于观察者模式,因此您的 UI 始终与最新数据保持同步。
  2. 它是生命周期感知组件,因此仅在其处于活动状态时更新 UI。
  3. 当 Hi 被破坏时,内存泄漏安全,旧引用也被清除。

【讨论】:

  • 好的,但是我可以使用更多回调方法实现我自己的观察者模式,如果我使用 Wea​​kReferences,当 GarbageCollector 决定销毁它们时,旧引用也会被清除。也许我没有正确理解你所说的
【解决方案2】:

livedata被设计成不会丢失状态,在更改配置时存储在视图模型中,当lifeCycleOwner达到销毁状态时取消订阅。

但是,如果您的应用程序被系统杀死,那么您应该注意如何使用捆绑包或https://developer.android.com/topic/libraries/architecture/viewmodel-savedstate 保存模型的视图状态

如果您需要一次性活动,请使用https://github.com/googlesamples/android-architecture/blob/dev-todo-mvvm-live/todoapp/app/src/main/java/com/example/android/architecture/blueprints/todoapp/SingleLiveEvent.java

【讨论】:

    猜你喜欢
    • 2020-03-05
    • 2014-04-28
    • 1970-01-01
    • 2020-09-18
    • 2020-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-10
    相关资源
    最近更新 更多