有人可以解释我如何使用MediatorLiveData设计Android应用程序的不同层吗?
我有以下具体问题:我从(Room)数据库中以LiveData的形式获取约会列表(带有开始日期和结束日期)。在我看来,我想以一种标准化的方式显示约会,即约会的高度取决于持续时间,并且如果以下约会不是在第一个约会的结束日期开始的话,两个约会之间应该有“空白”
作为第二个功能,我认为日历只能以最大的整数小时开始,该小时数小于或等于几天中一组约会中最早的约会。因此,我要从数据库中获取另一个LiveData,它包含一个Calendar对象,该对象具有指定时间段内约会的最早开始日期。
我现在对具有不同抽象层的最佳设计感到困惑。
在数据层,我使用以下方法创建了一个DAO: @道 抽象类AppointmentDao { //在指定时间段内加载约会: 抽象的LiveData> getAppointmentsInPeriod(String startDate,String endDate);
//Returns the minimum starttime of appointments in a specificed period:
abstract LiveData<Calendar> getEarliestBeginning(String startDate, String endDate);
}
按照其他Android指南的建议,我创建了一个存储库层,该存储库层仅转发了DAO中的LiveData。
我现在在ViewModel上苦苦挣扎。在这里,我必须加载约会并填补它们之间的空白。 但是,应转到视图的约会列表取决于存储库中的列表以及最早的开始。 因此,我认为,这是将这些LiveData合并到MediatorLiveData中的最佳方法,该转发到视图。
所以我的方法是:
public AppointmentViewModel extends AndroidViewModel {
AppRepository repository;
LiveData<List<Appointment>> appointmentsFromDatabase;
LiveData<Calendar> earliestBeginning;
LiveData<List<Appointment>> appointmentsForView;
public AppointmentViwModel(Application app) {
repository = new AppRepository(app);
appointmentsForView = new MediatorLiveData();
appointmentsForView.addSource(appointmentsFromDatabase, appointments -> {
if(earliestBeginning != null && earliestBeginning.getValue() != null)
appointmentsForView = fillList(appointments, earliestBeginning.getValue());
});
appointmentsForView.addSource(earliestBeginning, beginning -> {
if(appointmentsFromDatabase != null && appointmentsFromDatabase.getValue() != null && !appointmentsFromDatabase.getValue().isEmpty())
appointmentsForView = fillList(appointmentsFromDatabase.getValue(), beginning);
});
}
public LiveData<List<Appointment>> getAppointmentsInPeriod(String startDate, String endDate) {
appointmentsFromDatabase = repository.getAppointmentsInPeriod(startDate, endDate);
earliestBeginning = repository.getEarliestBeginning(startDate, endDate);
return appointmentsForView;
}
private static LiveData<List<Appointment>> fillList(List<Appointment> appointments, Calendar beginning) {
//Fills the gaps in the given list
}
}
我实际上并不知道,我必须在哪里检查一个空引用和一个空集合,因为我在编程时遇到了很多异常,所以我总是在检查这些东西。
我的疑问在于MediatorLiveData的处理。在构造函数中,它指向未初始化的类变量,因为它们需要一些从视图中获取的输入值,这些值调用getAppointmentsInPeriod方法。但是此方法每次都会覆盖对象。
所以也许有人可以向我解释这种设计的最佳实践(模式)。
非常感谢您!