【问题标题】:Multiple instances of Livedata observersLivedata 观察者的多个实例
【发布时间】:2019-02-21 04:01:00
【问题描述】:

我正在努力寻找在一个活动中多次调用 livedata 观察者而不创建它的多个实例的解决方案,这会导致当数据库更改时出现问题,我从所有实例中得到回调。

视图模型

public class RatingsViewModel extends AndroidViewModel {

private RatingsRepository ratingsRepository;
private LiveData<List<Rating>> ratingsList;

public RatingsViewModel(Application application) {
    super(application);
    ratingsRepository = new RatingsRepository(application);

}

public LiveData<List<Rating>> getRatingsByDate(LocalDate date) {
    ratingsList = ratingsRepository.getActivitiesByDate(date);
    return ratingsList;
}

活动

private void getRatingsByDate(LocalDate date) {
    ratingsViewModel.getRatingsByDate(date).observe(this, activities -> {
        // list populating stuff
    });
}

我尝试调用 hasObserver() 但它返回 false 所以我无法删除观察者。

【问题讨论】:

  • 我不明白的事情,你为什么要观察一个方法并通过日期?。在您的视图模型中创建一个设置器并在那里传递日期,然后数据库给出您可以在活动的 OnCreate() 中观察到的结果
  • @PrashanthVerma 当用户点击显示这些数据的日期时,日期是动态的,因此您必须使用新日期拨打电话。我不明白你在 viewmodel 中使用 setter 的解决方案。
  • android.arch.lifecycle.Transformations实用程序类
  • 让我直说。有用户选择的日期,您需要获取该日期并在 DB 中搜索并将其显示在屏幕上,这是正确的。!?
  • 仔细阅读Transform LiveData部分-特别注意"Similar to map(), applies a function to the value stored in the LiveData object and unwraps and dispatches the result downstream"

标签: android reactive-programming android-architecture-components android-livedata


【解决方案1】:

您应该能够执行以下操作(在 Kotlin 中,但如果需要,应该可以轻松翻译成 Java)

val dateLiveData: MutableLiveData<Date> = MutableLiveData()

val ratingsList = MediatorLiveData<List<Rating>>().apply {
    this.addSource(dateLiveData) {
        this.value = ratingsRepository.getActivitiesByDate(dateLiveData.value)
    }
}

fun setDate(date: Date) {
    dateLiveData.value = date
}

例如,您可以在活动/片段中从onCreate() 调用observe,然后在该值更改时调用setDate()

【讨论】:

  • 所以这里的逻辑是观察一个观察者的参数?,谢谢。
  • 您会调用例如ratingsViewModel.ratingsList.observe()(或者可能通过getter 获取ratingsList)......然后在该值更改时单独调用setDate(date)
  • @AgonAvdijaj 你有机会试试这个吗?
  • 是的,非常感谢,但我采用了转换方法。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-22
相关资源
最近更新 更多