为什么ViewModel中的LiveData对象应该在声明期间实例化?

时间:2017-12-08 18:52:32

标签: java android android-architecture-components

请考虑Google's Architecture Components教程中的以下代码:

class MyViewModel extends ViewModel {
    private final PostalCodeRepository repository;
    private final MutableLiveData<String> addressInput = new MutableLiveData();
    public final LiveData<String> postalCode =
            Transformations.switchMap(addressInput, (address) -> {
                return repository.getPostCode(address);
             });

  public MyViewModel(PostalCodeRepository repository) {
      this.repository = repository
  }

  private void setInput(String address) {
      addressInput.setValue(address);
  }
}

请注意,LiveData个对象在声明期间被实例化。

this answer我可以看出,在声明期间或在缩窄器内部实例化它们之间的差异非常小。然而,根据我的理解,当NPE对象通过构造函数实例化时,有可能有LiveData s或具有陈旧引用,因此谷歌&#39;建议是在声明期间实例化它们。

我的预感是因为它可能与通过反射创建ViewModel对象有关,但我无法确定它是如何影响这些对象的创建的。

为什么要在声明期间实例化LiveData个对象?

1 个答案:

答案 0 :(得分:1)

  

请考虑使用Google的架构组件教程中的以下代码:

这不是教程。它是一些代码片段的参考,其中许多代码片段无法编译,因为它们用于说明语法和调用结构,而不是实际运行。

  

请注意,LiveData对象在声明期间实例化。

这就是编写该代码片段的人选择做的事情。

  

所以Googles&#39;建议是在声明期间实例化它们。

谷歌没有提出这样的建议。您引用的代码段是示例,仅此而已。

  

为什么要在声明期间实例化LiveData对象?

他们没有带初始化器的字段。如果您愿意,欢迎您在构造函数中实例化它们。 ViewModel有关于构造函数的特定规则(例如,如果你不提供工厂,它需要有一个零参数构造函数,或者Application - AndroidViewModel - getContainer()->get('router')->generate( 'custom_error', ['key' => 'some val'], 0 ); 构造函数。 。但是,除此之外,你可以做任何你想做的事。

使用初始化程序通常更简洁 - 初始化程序是可用选项 - 因此可能存在使用初始化程序的趋势