2017-12-28 20 views
0

テーブルが空であることを確認するにはどうすればよいですか?私はアクティビティに保証値または同期戻り値を持っていませんか?MediatorLiveData.getValue()。直接削除後にisEmpty()がfalseを返す

ねえ、私はアーキテクチャのコンポーネントを初めて使いました。 私はその後、私が呼び出す必要がMediatorLiveData、 に 私がする必要があるすべてはバックグラウンドサービスを使用してルームのエンティティのすべての値を削除することで、「AlarmManagerを」MediatorLiveData .. と非常に奇妙な問題を有するpostValue(ヌル) refreshTables()テーブルにデータがないかどうかをチェックし、Webサービスを呼び出して値を挿入します。

すべて正常に動作しますが、削除後にrefreshTables()の呼び出しを見たときに、getValue()。isEmpty()がfalseを返すことがあります。

このことが起こると、データなしでテーブルが残されます。

私は、MediatorLiveDataの観察が遅れていると思います。

注:

1 - 私は削除した後、スレッド(エグゼ)でrefreshTables()を呼び出しています、もちろん、refreshTables()はその執行を使用して実行します。

2-このフォールトは、ほとんど正常に動作して20回ごとに発生します。それはLifeCycleOwner

にLiveDataをキャストすることはできませんので

3-私は

、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

が含まれているのonChangeを上書きしようとしましたが、例外がスローされました自分の質問:)

深い掘削の時間の後、私は何もgetValue()を行うことを発見した。 問題は.postValue()メソッドにあり、UiThreadを使用して値をLiveDataに配置しました。これは確かにUIにタスクを追加する必要があります。これは遅れる可能性があり、このタスクを終了する前にデータをチェックすると矛盾が生じます。

テーブルからすべてのデータをロードしようとしても、矛盾情報を提供していました。 Source()を削除しようとしても、この問題については何も行いません。

私は正確な情報を与える "SELECT COUNT(*)FROM tables"クエリを使用してこの問題を処理しました。 refereshTables();を呼び出す前に "Thread.sleep(100)"を追加してください。問題を修正するが、非常に悪いユーザーエクスペリエンスを与える。

私はこれを理解することができましたhttps://code.tutsplus.com/tutorials/android-architecture-component-livedata--cms-29317

関連する問題