📜  Android 中的 LiveData 与 ObservableField

📅  最后修改于: 2022-05-13 01:58:44.936000             🧑  作者: Mango

Android 中的 LiveData 与 ObservableField

LiveData 有助于减少内存泄漏和手动生命周期处理。它还确保 UI 始终与数据保持同步,即使在我们仍在使用我们的应用程序时重新启动了应用程序的活动。它是android架构模式的一部分。它用于观察视图的变化并在视图处于活动状态时更新视图。因此,LiveData 具有生命周期意识。

一个可观察的类,它包含一个可包裹的对象(允许对象从包裹中读取和写入,包裹中可以包含消息容器内的展平数据)。一个对象包装器,使其可观察。可以使用 ObservableField 类来代替创建 Observable 对象。如果您的对象类需要更新的属性较少,或者您不想观察对象中的每个字段,则可以使用 ObservableFields 来更新 UI。您可以将变量声明为 ObservableField,当设置新数据时,UI 将被更新。

与实现 Observable 的对象(例如可观察字段)不同,LiveData 对象了解订阅数据更改的观察者的生命周期。这些知识可以带来很多好处,这些在使用 LiveData 的优势中进行了说明。在 Android Studio 3.1 及更高版本中,您可以在数据绑定代码中将可观察字段替换为 LiveData 对象。在某些情况下,您可能更喜欢使用实现 Observable 接口的 View Model 组件而不是使用 LiveData 对象,即使您失去了 LiveData 的生命周期管理功能。使用实现 Observable 的 View Model 组件可以让您更好地控制应用程序中的绑定适配器。例如,此模式使您可以更好地控制数据更改时的通知,它还允许您指定自定义方法来设置双向数据绑定中的属性值。

相似之处

  • 两者都适用于数据绑定,它允许您将 XML 布局中的 UI 组件绑定到应用程序中的数据源。
  • 绑定视图在后台自动取消订阅。
  • Plain Old Java Object 类也可以使用这些更改。

差异

  • LiveData 允许普通旧Java对象订阅者了解生命周期,这意味着如果您有一个属性 B 想要在 A 更改时更新,您可以选择在附加视图处于非活动状态时不接收更新。这可以节省您的应用程序中的空间/资源。
  • ObservableField 的后台线程更新很快。 MutableLiveData.postData比较慢。
  • LiveData 和 ObservableField 的值始终为 null,但原始实现(不直接引用算法或行为的东西)Observable -Integer、-Floating、-Boolean 等不为 null。
  • MutableLiveData 不会在初始化时设置构造函数值。

什么时候使用什么?

  • 当应用程序在后台时,您是否有外部事件可能会触发 View Model 中的数据处理 API、集成 API、流程规划器和流程调度器更改?您可能应该选择 LiveData
  • 您是否要求后台线程上的值更新快速且即时?使用Observables
  • 以上要求都没有?您可以同时使用这两种方法,但 ObservableField 易于使用,并且您可以根据您的选择更改实现,而这在实时数据中是无法做到的。

现在,让我们了解 ObservableField 以及为什么即使存在 ObservableField 也需要 LiveData

  • ObservableField支持生命周期,但 LiveData 支持生命周期,因此只会通知“活动”的可观察对象。
  • 我们必须在 ObservableField 中手动处理Lifecycle 感知。
Kotlin
// LiveData
  
class SampleViewModel : ViewModel() {
  
    // Create a LiveData with a String
    val currentName : MutableLiveData by lazy
    {
        MutableLiveData()
    }
  
    // Rest of the ViewModel...
}
  
// Declaring it
val liveDataA = MutableLiveData()
                // Trigger the value change
                liveDataA.value
    = someValue
    // Optionally, one could use liveDataA.postValue(value)
    // to get it set on the UI thread


Java
// ObservableField
  
public class MyDataObject {
    private Context context;
    public final ObservableField A
        = new ObservableField();
    public final ObservableField B
        = new ObservableField();
    public final ObservableField display
        = new ObservableField(A, B) {
              @Override public String get()
              {
                  return context.getResources().getString(
                      R.string.name, first.get, last.get());
              }
          };
    public final ObservableInt age = new ObservableInt();
}


使用 LiveData 有什么好处?

  • 无内存泄漏:由于观察者绑定到应用程序的生命周期,当不需要时,它会被销毁。
  • 活动停止不会导致崩溃:由于活动未在使用中,LiveData 也是如此。因此,数据流停止,从而阻止了后台堆栈中的崩溃。
  • 配置更改:由于屏幕旋转而重新创建视图时,它会处理最新数据。

你可以一直使用 LiveData,只要有 Lifecycle Owner 可以观察。我更喜欢将仅与 ViewModel 相关的绑定字段保留为 Observable,并将 LiveData 用于状态更改也与 Activity 或 Fragment 相关的字段。

Java

// ObservableField
  
public class MyDataObject {
    private Context context;
    public final ObservableField A
        = new ObservableField();
    public final ObservableField B
        = new ObservableField();
    public final ObservableField display
        = new ObservableField(A, B) {
              @Override public String get()
              {
                  return context.getResources().getString(
                      R.string.name, first.get, last.get());
              }
          };
    public final ObservableInt age = new ObservableInt();
}