2017-12-08 21 views
0

私はAndroidアプリ(Kotlinコード)でデータの永続性を実装するためにGoogle Roomを使用しています。ルームでは、すべての操作(データベースとのクエリ)が非同期であることが要求されます。ユーザーが操作が実行されるのを待って、クエリが終了する前に正しく構成されていないコンポーネントとのやりとりを防ぐことができます。非同期タスクからUIスレッドにアクセスすることができないので、これをどのように達成できますか?Google Roomで使用される非同期タスクの進行状況を正しく表示するには

PS:私はまた、進歩/ローディングインジケーターが持っているといいAPI​​をいくつか呼び出します。私はこれらの呼び出しでRxJavaを使用していますが、私はこの技術をかなり新しくしており、正しく構造化する方法がわかりません。 DB操作の

サンプル:

private fun getDataFromCache() { 
    //show progress indicator here 
     execute({ 
      try { 
       //Get items from cache 
       val entities = daoData.findAll() 

       if (entities.isNotEmpty()) { 
        //do something 
       } else { 
        //do something else 
       } 
      } 
      catch (e: Exception){ 
       Log.e("error", e.toString()) 
      } 
      finally{ 
       //dismiss progress indicator here 
      } 
     }) 
    } 

答えて

0

フェッチは、あなたが任意でできるHUDを阻止するモーダル、ユーザーインターフェイスを表示するKProgressHUDのようなライブラリを使用することができます働いている間、アプリを使用してからユーザーを防ぐために進捗インジケータを含む。 show progress indicator hereのコメントをモーダルHUDの作成に置き換え、//dismiss progress indicator hereのUIスレッドでHUDを削除するだけで済みます。

進捗状況については、executeコード内のHUDの進捗状況を手動で更新する必要があります。まず、dao findAll()を呼び出して、合計の要素の数(いくつかはSELECT COUNT(*)クエリ)を返して、進行状況バーの長さを知る必要があります。 findAll()の代わりに、データベースへのバッチ/ページ呼び出しを作成し、N個のレコードをループ内にフェッチする必要があります。このループの内部では、HUDを現在のループ進捗のパーセンテージと開始前の合計カウントとで更新することができます。

私はルームAPIに慣れていないので、そのようなループでは擬似コードを提供することはできませんが、通常はSQLカーソルを開いてループ内のデータをループ内にフェッチし続けることになりますあなたがどれくらい多くのアイテムを読んでリストに蓄積しているかを記録しています。

+0

乾杯、私たちは同様のアプローチに従った! –

関連する問題