LiveData 的更新值丢失
updated value of LiveData gets lost
LiveData 向上游传播数据是否需要最短时间?
我有一个从存储库更新的 MutuableLiveData。更新代码从互联网加载一些数据并设置 MutuableLiveData 的值。下载发生在一个或多个 workerThread 上,并且正在使用下载的数据对存储库进行回调。这是相关代码。我使用 synchronized 来防止线程同时尝试更改变量。
在存储库中:
@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: schedule returned:Owner:hym
WeekStart:03 Sep
Events:19
08-20 21:11:26.015 3001-3065/nl.kl_solutions.schedulecompareforzermelo D/ScheduleRepository: schedule returned:Owner:6409
WeekStart:03 Sep
Events:27
08-20 21:11:26.348 3001-3001/nl.kl_solutions.schedulecompareforzermelo D/WeekScheduleFragment: Overlay weekschedule changed
08-20 21:11:26.349 3001-3001/nl.kl_solutions.schedulecompareforzermelo D/WeekScheduleFragment: Owner:6409
WeekStart:03 Sep
Events:27
前两行来自存储库,显示了通过回调返回到不同线程上的存储库的计划。最后两行是片段中观察者的一次触发,显示仅记录了对最后一个时间表的更改。第一个更改在某处丢失了。
根据设计,如果您在主线程执行 posted 任务之前多次调用 postValue,则只会调度最后一个值。
https://developer.android.com/reference/android/arch/lifecycle/LiveData.html#postValue(T)
还有一个不使用 post 操作的替代 setValue 方法 - 要使用它,您需要确保在主线程上调用它。
正如 Chris 所说,您必须使用 setValue 来获取所有事件。但是您可以为此使用 Kotlin 的协程而不是 postValue,然后您将轻松获得所有更改(并且它是一个简单的重构):
//make sure you have a CoroutineScope to be able to use 'launch'
launch (Dispatchers.Main){
yourMutableLiveData.value = "YourValueHere"
}
LiveData 向上游传播数据是否需要最短时间?
我有一个从存储库更新的 MutuableLiveData。更新代码从互联网加载一些数据并设置 MutuableLiveData 的值。下载发生在一个或多个 workerThread 上,并且正在使用下载的数据对存储库进行回调。这是相关代码。我使用 synchronized 来防止线程同时尝试更改变量。
在存储库中:
@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: schedule returned:Owner:hym WeekStart:03 Sep Events:19 08-20 21:11:26.015 3001-3065/nl.kl_solutions.schedulecompareforzermelo D/ScheduleRepository: schedule returned:Owner:6409 WeekStart:03 Sep Events:27 08-20 21:11:26.348 3001-3001/nl.kl_solutions.schedulecompareforzermelo D/WeekScheduleFragment: Overlay weekschedule changed 08-20 21:11:26.349 3001-3001/nl.kl_solutions.schedulecompareforzermelo D/WeekScheduleFragment: Owner:6409 WeekStart:03 Sep Events:27
前两行来自存储库,显示了通过回调返回到不同线程上的存储库的计划。最后两行是片段中观察者的一次触发,显示仅记录了对最后一个时间表的更改。第一个更改在某处丢失了。
根据设计,如果您在主线程执行 posted 任务之前多次调用 postValue,则只会调度最后一个值。
https://developer.android.com/reference/android/arch/lifecycle/LiveData.html#postValue(T)
还有一个不使用 post 操作的替代 setValue 方法 - 要使用它,您需要确保在主线程上调用它。
正如 Chris 所说,您必须使用 setValue 来获取所有事件。但是您可以为此使用 Kotlin 的协程而不是 postValue,然后您将轻松获得所有更改(并且它是一个简单的重构):
//make sure you have a CoroutineScope to be able to use 'launch'
launch (Dispatchers.Main){
yourMutableLiveData.value = "YourValueHere"
}