【发布时间】: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 是的,你是对的,但我想问的是,如果出于某种原因我决定使用 WeakReference 创建自己的侦听器,我将失去 LiveData 提供的一些非常有益的功能。也许在使用 WeakReferences 的情况下,我会比使用 LiveData 更频繁地发生内存泄漏
-
你能发布你用来传输数据和状态的包装类吗?
-
普通回调与
LiveData或RxJava之间并没有太大的技术差异。主要区别在于设计。如果您使用LiveData或RxJava,您可以将您的 ViewModel 层与 View 层完全隔离,而如果您只使用回调,您的 View 需要以某种方式传递侦听器甚至它自己对 ViewModel 的引用,而 ViewModel 需要保留这些参考。
标签: android android-livedata weak-references