LiveData 是抽象的 android

LiveData is abstract android

我尝试初始化我的 LiveData 对象,但出现错误:"LiveData is abstract, It cannot be instantiated"

LiveData listLiveData = new LiveData<>();

因为它是抽象的(如@CommonsWare 所说),您需要将它扩展到一个子类,然后按照以下形式覆盖所需的方法:

public class LiveDataSubClass extends LiveData<Location> {

}

docs for more details

在 ViewModel 中,您可能想改用 MutableLiveData

例如:

class MyViewModel extends ViewModel {
  private MutableLiveData<String> data = new MutableLiveData<>();

  public LiveData<String> getData() {
    return data;
  }

  public void loadData() {
    // Do some stuff to load the data... then
    data.setValue("new data"); // Or use data.postValue()
  }
}

或者,在 Kotlin 中:

class MyViewModel : ViewModel() {
  private val _data = MutableLiveData<String>()
  val data: LiveData<String> = _data

  fun loadData() {
    viewModelScope.launch {
      val result = // ... execute some background tasks
      _data.value = result
    }
  }
}

是的,你不能实例化它,因为它是一个抽象class。如果你想观察其他livedata对象可以尝试使用MutableLiveData if you want to set values in the live data object. You can also use Mediator live data

您需要使用 MutableLiveData,然后将其转换为它的父级 class LiveData。

public class MutableLiveData extends LiveData

[MutableLiveData is] LiveData which publicly exposes setValue(T) and postValue(T) method.

你可以这样做:

fun initializeLiveData(foo: String): LiveData<String> {
    return MutableLiveData<String>(foo)
}

然后你得到:

Log.d("now it is LiveData", initializeLiveData("bar").value.toString())
// prints "D/now it is LiveData: bar"

我认为实现此目标的更好方法是使用我们称之为 Backing Property 的方法来实现更好的 Encapsulation 属性。

用法示例:

private val _userPoints = MutableLiveData<Int>()// used as a private member

val userPoints: LiveData<Int>
    get() {
        return _userPoints 
    } //used to access the value inside the UI controller (Fragment/Activity). 

这样做可以维护 ViewModel class 私有的可编辑 MutableLiveData,而它的 read-only 版本维护为 LiveData,带有getter即returns原值。

P.S。 - 注意两个字段的命名约定,使用 (_) 下划线 。这不是强制性的,但建议这样做。