Firebase Android Offline-Leistung

8

Beim Speichern von ungefähr 5000 Unterknoten unter einem einzelnen Knoten wird die Initialisierung der Firebase sehr langsam, wenn die Offline-Funktionen verwendet werden. Es dauert ~ 30 Sekunden, bevor die erste Abfrage ausgeführt wird. Nach der Initialisierung dauert die Ausführung nachfolgender Abfragen (z. B. das Auflisten der ersten 25 Unterknoten) weniger als eine Sekunde.

Ich verwende die folgenden Eigenschaften, um die Offline-Funktionen zu aktivieren:     Firebase.getDefaultConfig (). SetPersistenceEnabled (true);     firebase.keepSynced (true);

Meine Struktur sieht so aus:

%Vor%

"Synchronisiert" wird für den Knoten " <uid> " festgelegt. Die Unterknoten werden in einer Recycler-Ansicht angezeigt. Am liebsten würde ich alle (statt 25 pro Seite) auflisten, aber ich verstehe, dass dies nicht möglich ist, da es keinen Cursor-ähnlichen Mechanismus gibt (wie Android für SQLite bietet), der für die Arbeit mit Firebase verfügbar ist.

Ist das Absicht und überarbeite ich meine Datenstruktur? Oder kann ich die Initialisierungszeit auf andere Weise reduzieren?

Ich habe unten etwas Logging zur Verfügung gestellt. Wie Sie sehen können, wird viel Müll gesammelt. Bewertet Firebase beim Initialisieren die gesamte Datenbank?

Danke! Niels

%Vor%

PS: Dies ist ein Cross-Post: Ссылка

    
Niels 04.04.2016, 11:26
quelle

2 Antworten

0

Die Daten so zu sharten, dass ein Wurzelknoten höchstens 200 Unterknoten enthält, scheint die Antwort zu sein. Ich setze .keepSynced (true) auf die Shards und dies führt zu einer viel besseren Performance.

Um die sharded-Liste in einer einzelnen Recycler-Ansicht darzustellen, habe ich eine Klasse FirebaseArrays erstellt, bei der es sich um eine Sammlung von FirebaseArray handelt, die mehrere Arrays zu einer einzigen beobachtbaren Sammlung zusammenfasst.
Ссылка

Ich habe auch den FirebaseRecyclerAdapter angepasst, um eine FirebaseArrays als zugrunde liegende Datenstruktur anstelle eines einzelnen FirebaseArray zu verwenden. Die Schnittstelle wird mit einigen Methoden erweitert, um zusätzliche Firebase-Pfade (d. H. Shards) hinzuzufügen.
Ссылка

Diese Pfade werden bei einem 'load more'-Ereignis hinzugefügt (z. B. beim endlosen Scrollen).

%Vor%     
Niels 12.06.2016, 09:19
quelle
1

Initialisierung bedeutet setValue zu diesem Knoten richtig? Also, die Initialisierung von 5000 Unterknoten unter einem einzigen Knoten unter ~ 30s scheint mir sehr ungewöhnlich. Ich habe mit fast der gleichen Größe von Daten unter einem einzelnen Knoten mit einer viel besseren Leistung gearbeitet. Ich bin also nicht sicher, wie viele Attribute Sie unter einen einzelnen Unterknoten stellen, aber ich denke, Sie müssen die Leistung erneut überprüfen. Ich denke, Sie verwenden onCompleteListener auf setValue , um die Zeit zu berechnen, die Sie für die Initialisierung der Daten aufgewendet haben, da die UI-Ansicht nicht die genaue Zeit angibt und oft langsamer ist als die tatsächliche Betriebszeit.

  

Am liebsten würde ich alle aufzählen (statt 25 pro Seite) aber ich   zu verstehen, dass dies nicht möglich ist, da es keinen Cursor gibt   Mechanismus (wie Android für SQLite bereitstellt) verfügbar für die Arbeit mit   Firebase.

Ich bin mir über Ihren Zweck nicht ganz sicher, aber was ich für diese Art von Fällen vorschlagen könnte, ist sowohl die SQLite- als auch die Firebase-Datenbank zu verwalten. Lass mich das klären.

Die Idee besteht darin, dieselbe Kopie der Firebase-Datenbank für einen bestimmten Benutzer auf dem Telefon des Benutzers beizubehalten. So kann die lokale Datenbank bei Bedarf jederzeit Ihren Zweck erfüllen. Sie können die Datenbank abfragen und CursorLoader verwenden, mit denen Sie Erfahrung gesammelt haben.

Es hat auch einige andere Vorteile. Sie können die Offline-Synchronisierung mit Ihrem eigenen Mechanismus durchführen. Wenn das Internet nicht verfügbar ist, speichern Sie die Daten, die Sie später synchronisieren möchten, in Ihrer lokalen Sqlite-Datenbank. Wenn die Verbindung besteht, erhalten Sie einen Rückruf in Ihrem BroadcastReceiver . Sie können die Offline-Daten dann einfach an die Firebase weiterleiten. Firebase macht das natürlich einfacher, aber wie auch immer, da Sie sich sehr um die Leistung sorgen, können Sie dies ausprobieren.

Das Verhalten von GC, das Sie gepostet haben, ist üblich, wenn Ihre Anwendung zu viel Arbeit macht. Firebase verwendet im Wesentlichen setValue , um die Verbindung zur entfernten Datenbank aufrechtzuerhalten. Also müssen Sie überprüfen, ob Sie unnötige Verbindungen zur Firebase-Datenbank haben. Versuchen Sie, WebSocket zu verwenden, wenn die Listener nicht mehr benötigt werden.

  

Bewertet Firebase die gesamte Datenbank beim Initialisieren?

Ich bin mir noch nicht sicher, was Sie mit der Initialisierung gemeint haben, aber ja, wenn Sie denselben Knoten erneut für removeListener zu diesem Knoten verwenden, ersetzt er die vorherigen Daten durch die neuen Daten.

    
Reaz Murshed 04.04.2016 15:32
quelle

Tags und Links