【问题标题】:MediatorLiveData.getValue().isEmpty() returns false after delete directlyMediatorLiveData.getValue().isEmpty() 直接删除后返回false
【发布时间】: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


    【解决方案1】:

    回答我自己的问题:)

    经过数小时的深入挖掘,我发现 getValue() 无关紧要。 问题出在 .postValue() 方法中,该方法使用 UiThread 将值放入 LiveData。这肯定需要向 UI 添加一个可能会延迟的任务,并在完成此任务之前检查数据会导致不一致。

    即使尝试从表中加载所有数据也会提供不一致的信息。 尝试 removeSource() 也不会解决这个问题。

    我设法通过使用“SELECT COUNT(*) FROM tables”查询来处理这个问题,该查询为我提供了准确的信息。

    顺便说一句,在调用refereshTables()之前添加“Thread.sleep(100)”;解决了这个问题,但给用户带来了非常糟糕的体验。

    一个奇妙的解释让我明白了这一点是https://code.tutsplus.com/tutorials/android-architecture-component-livedata--cms-29317

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-22
      • 2014-11-20
      • 2021-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多