MediatorLiveData.getValue()。isEmpty()直接删除后返回false

时间:2017-12-28 17:06:04

标签: java android mvvm android-room android-architecture-components

如果知道我不在活动中并且保证或同步返回值

,我如何检查表是否为空?

嘿伙计们,我是架构组件的新手。 我对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();


    });
}

1 个答案:

答案 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