LiveData的更新值丢失了

时间:2018-08-20 19:21:34

标签: android android-livedata

LiveData是否需要最少的时间向上游传播数据?

我有一个MutuableLiveData,它是从存储库更新的。更新代码从Internet加载一些数据并设置MutuableLiveData的值。下载发生在一个或多个workerThreads上,并且正在使用已下载的数据对存储库进行回调。这是相关的代码。我使用sync来防止线程尝试同时更改变量。

在存储库中:

@Override
public void returnResult(Schedule scheduleToReturn) {
     synchronized(this){
     mSecondaryWeekSchedule.postValue(scheduleToReturn)};
}

在片段中:

mScheduleViewModel.getOverlayWeekSchedule().observe(getViewLifecycleOwner(), new Observer<Schedule>() {
        @Override
        public void onChanged(@Nullable Schedule schedule) {
            Log.d(DEBUGTAG, "Overlay weekschedule changed");
            Log.d(DEBUGTAG, ""+schedule.toString());
            addOverlay(schedule);
        }
    });

getOverlayWeekSchedule仅链接到存储库中的liveData变量。我在存储库中设置适当的Log.d():

  

08-20 21:11:25.982 3001-3049 / nl.kl_solutions.schedulecompareforzermelo D / ScheduleRepository:计划已返回:所有者:hym       周末开始时间:9月3日       活动:19   08-20 21:11:26.015 3001-3065 / nl.kl_solutions.schedulecompareforzermelo D / ScheduleRepository:计划已返回:所有者:6409       周末开始时间:9月3日       活动:27   08-20 21:11:26.348 3001-3001 / nl.kl_solutions.schedulecompareforzermelo D / WeekScheduleFragment:重叠的周计划已更改   08-20 21:11:26.349 3001-3001 / nl.kl_solutions.schedulecompareforzermelo D / WeekScheduleFragment:Owner:6409       周末开始时间:9月3日       活动:27

前两行来自,存储库显示了通过回调返回到不同线程上的存储库的调度。最后两行是片段中观察者的一个触发,仅显示对最后一个计划的更改。第一个更改在某处丢失。

2 个答案:

答案 0 :(得分:2)

根据设计,如果在主线程执行发布的任务之前多次调用postValue,则只会分派最后一个值。

https://developer.android.com/reference/android/arch/lifecycle/LiveData.html#postValue(T)

还有另一种setValue方法,它不使用后操作-要使用此方法,您需要确保在主线程上被调用。

答案 1 :(得分:0)

就像克里斯说的那样,您必须使用setValue来获取所有事件。但是您可以为此使用Kotlin的协程而不是postValue,然后您将轻松获得所有更改(这是一个简单的重构):

//make sure you have a CoroutineScope to be able to use 'launch'
launch (Dispatchers.Main){ 
    yourMutableLiveData.value = "YourValueHere" 
}