如果知道我不在活动中并且保证或同步返回值
,我如何检查表是否为空?嘿伙计们,我是架构组件的新手。 我对MediatorLiveData有一个非常奇怪的问题.. 我需要做的就是使用后台服务" AlarmManager"删除房间实体中的所有值。 和postValue(null)到MediatorLiveData , 然后我需要调用refreshTables()来检查它调用webservice的表中是否没有数据并插入值。
一切正常但是当我在删除后看到调用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();
});
}
答案 0 :(得分:0)
回答我自己的问题:)
经过数小时的深挖,我发现getValue()没什么可做的。 问题出在.postValue()方法中,它使用UiThread将值放在LiveData中。这肯定需要向UI添加一个可能被延迟的任务,并在完成此任务之前检查数据会导致不一致。即使尝试从表中加载所有数据也提供了不一致的信息。 尝试removeSource()也无法解决这个问题。
我设法通过使用“SELECT COUNT(*)FROM tables”查询来处理此问题,该查询为我提供了准确的信息。
btw,在调用refereshTables()之前添加“Thread.sleep(100)”;修复了问题,但却给用户带来了非常糟糕的体验。
一个奇妙的解释让我想出来的是https://code.tutsplus.com/tutorials/android-architecture-component-livedata--cms-29317