【发布时间】:2017-12-28 17:06:03
【问题描述】:
如果知道我不在活动中有保证或同步的返回值,我如何检查表是否为空??
大家好,我是架构组件的新手。 我对 MediatorLiveData 有一个非常奇怪的问题.. 我需要做的就是使用后台服务“AlarmManager”删除房间实体中的所有值 和 postValue(null) 到 MediatorLiveData, 然后我需要调用 refreshTables() 来检查表中是否没有数据,它会调用 Web 服务并插入值。
一切正常,但是当我看到删除后调用 refreshTables() 时,有时条件 getValue().isEmpty() 返回 false!
发生这种情况时,表格中没有数据。
我认为 MediatorLiveData 观察存在延迟。
注意事项:
1-我在删除后的线程(执行程序)中调用 refreshTables(),当然,refreshTables() 使用其执行程序执行。
2- 这个故障几乎每正常工作 20 次就会发生一次。
3- 我试图覆盖 onChange 但抛出异常,因为它无法将 LiveData 转换为 LifeCycleOwner
4- TableEntity 只是一个房间实体,包含有关餐桌的字段
//the constructor
private DataRepository(AppDatabase database
) {
this.mDatabase = database;
executor = new AppExecutors();
mObserableTables = new MediatorLiveData<>();
mObserableTables.addSource(mDatabase.tableDao().loadAllTables(),
tableEntities -> {
if (mDatabase.getDatabaseCreated().getValue() != null)
mObserableTables.postValue(tableEntities);
});
}
private MediatorLiveData<List<TableEntity>> mObserableTables;
public void refereshTables()
{
executor.networkIO().execute(()->
{
try {
if(mObserableTables.getValue()==null || mObserableTables.getValue().isEmpty()) {//<-the problem
List<TableEntity> tableEntities = new WebserviceCall().getTablesOnline();
mDatabase.tableDao().insertOrReplaceAllTables(tableEntities);
}
}catch (IOException e)
{
Log.d(this.getClass().getName(),e.getMessage());
}
});
}
public void refreshTablesForService()
{
executor.diskIO().execute(()->
{
int deletedRows=mDatabase.tableDao().deleteAllTables();
Log.d(this.getClass().getName()
,"deleted rows from tables= "+String.valueOf(deletedRows));
mObserableTables.postValue(null);
refereshTables();
});
}
【问题讨论】:
标签: java android mvvm android-room android-architecture-components