2017-12-08 3 views
0

Ich verwende Google Room, um Persistenz von Daten in meiner Android-App zu implementieren (Kotlin-Code). Room fordert alle Vorgänge (Abfragen an und von der Datenbank) asynchron an. Ich möchte, dass der Benutzer darauf wartet, dass der Vorgang ausgeführt wird, sodass er nicht mit Komponenten interagieren kann, die vor dem Ende der Abfrage nicht ordnungsgemäß konfiguriert wurden. Wie kann ich dies erreichen, da ich von einer asynchronen Aufgabe nicht auf den UI-Thread zugreifen kann?So zeigen Sie den Fortschritt von asynchronen Aufgaben an, die von Google Room verwendet werden

PS: Ich mache auch einige Aufrufe an eine API, wo der Fortschritt/Lade-Indikator wäre schön zu haben. Ich verwende RxJava bei diesen Anrufen, aber ich bin ziemlich neu in dieser Technologie, und ich bin mir nicht sicher, wie ich es richtig strukturieren soll.

Beispiel einer db Betrieb:

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 
      } 
     }) 
    } 

Antwort

0

Um den Benutzer von der Nutzung der App zu verhindern, während der Abruf arbeitet Sie eine Bibliothek wie KProgressHUD verwenden können, eine modale anzuzeigen, Interface-Benutzer HUD blockiert, die gegebenenfalls Fügen Sie einen Fortschrittsanzeiger hinzu. Sie müssen nur den show progress indicator here-Kommentar durch die modale HUD-Erstellung und //dismiss progress indicator here durch Entfernen des HUD im UI-Thread ersetzen.

In Bezug auf den Fortschritt müssen Sie den HUD Fortschritt in Ihrem execute Code manuell aktualisieren. Zuerst müssen Sie Ihren Dao findAll() Aufruf in einen teilen, der die Anzahl der Elemente zurückgibt, die Sie insgesamt haben (einige SELECT COUNT(*) Abfrage), um zu wissen, wie lang der gesamte Fortschrittsbalken sein könnte. Dann müssten Sie anstelle von findAll() an die Datenbank gebündelte/seitenweise Aufrufe erstellen, die N Datensätze in einer Schleife abrufen. In dieser Schleife können Sie dann das HUD mit dem Prozentsatz Ihres aktuellen Schleifenfortschritts im Vergleich zur Gesamtanzahl aktualisieren, die Sie vor dem Start erhalten haben.

Ich bin nicht vertraut mit der Room-API, so kann ich keine Pseudo-Code auf eine solche Schleife bereitstellen, aber in der Regel läuft alles auf das Öffnen eines SQL-Cursors und holen Datenchargen in einer Schleife bis es ist erschöpft und verfolgt, wie viele Gegenstände Sie gelesen und in einer Liste gesammelt haben.

+0

Prost Kumpel, wir haben einen ähnlichen Ansatz verfolgt! –

Verwandte Themen