1

Ich benutze Firebase Geofire-Bibliothek, um Schlüssel basierend auf Ort zu holen, sondern wegen der Tausende von Schlüsseln zurückgegeben werden onKeyEntered() -Ereignis jedes Mal muss ich den Schlüssel beziehen Firebase und hole das Objekt zurück und setze es auf listview, das sehr langsam wird. Ich habe versucht, alle anderen Arbeiten in onKeyEntered() kommentieren, um zu sehen, wie schnell Geofire ist dann war ich überrascht mit 900 Milli's alle Rückrufe erhalten.Firebase android Wie bekomme ich Daten von der Liste der Schlüssel auf einmal

So, jetzt, was die beste optimierte Art und Weise ist es, die Daten von Feuerbasis mit dem Schlüssel übergeben onKeyEntered() Rückruf und setzen Sie ihn auf Listenansicht, so dass auch für Tausende von Einträgen Listenansicht erhalten sollte schnell

I load Denken Sie bei jedem Callback an AsyncTask, geben Sie die fetchenden Daten an AsyncTask weiter und fahren Sie mit dem nächsten Callback-Schlüssel fort. Tun Sie dies, aber nicht sicher, ob das richtig ist.

Oder laden Sie nur ein paar und laden Sie dann als Scroll ist auch eine gute Idee, aber geofire gibt Schlüssel aus der ganzen Datenbank, so gibt es keine Option, nur ein paar neueste zu bekommen, so nicht sicher, wie Sie es implementieren.

Dies ist, was ich versuche, aber Listenansicht lädt sehr langsam.

@Override 
public void onKeyEntered(String key, GeoLocation location) { 
    Log.d("geoevent", key); 
    mDatabaseTemp = FirebaseDatabase.getInstance().getReference("/posts/" + key); 
    mDatabaseTemp.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      Post post = new Post(); 
      post = dataSnapshot.getValue(Post.class); 
      mPosts.add(post); 
      mPostAdapter.notifyDataSetChanged(); 
      mRecycler.smoothScrollToPosition(mPosts.size() - 1); 
     } 

     @Override 
     public void onCancelled(DatabaseError databaseError) { 
      Toast.makeText(getActivity(), "error" + databaseError, Toast.LENGTH_LONG).show(); 

     } 
    }); 
} 
+0

Ich schrieb ein paar Hinweise unten, aber im Allgemeinen ist diese Frage zu breit. Bitte beschränke dich auf eine einzelne Frage, z. "Warum kommen die Gegenstände schneller zurück als ich erwartet habe?" (Dies liegt daran, dass [die Anfragen weitergeleitet werden] (http://stackoverflow.com/questions/35931526/speed-up-fetching-posts-for-my-social-network-app-by-using-query-instead-of-) -obse/35932786 # 35932786) übrigens). –

Antwort

1

Frage vom Typ „wie man am besten“ sind notorisch schwer zu beantworten. Aber ich werde ein paar Hinweise über das allgemeine Verhalten des Systems geben, von dem Sie vielleicht nichts wissen.

  1. Der Firebase-Datenbank-Client interagiert mit dem Netzwerk und der Festplatte in einem separaten Thread. Wenn Daten für Ihren Client verfügbar sind, ruft er Ihre Handler im Haupt-/UI-Thread auf. Das bedeutet, dass das Tätigen von Anrufen in AsyncTask nur nützlich ist, wenn Sie beim Callback wichtige Arbeit leisten.
  2. Der Firebase-Datenbankclient leitet die Aufrufe an den Server über eine einzelne Verbindung weiter. Weitere Informationen dazu, warum sich dies auf die Leistung auswirkt, finden Sie unter Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly.
  3. Laden von Tausenden von Elementen in ein mobiles Gerät über das Netzwerk ist im Allgemeinen keine gute Idee. Sie sollten nur Daten laden, die Sie dem Benutzer zeigen, und Tausende von Elementen sind weit über das hinaus, was vernünftigerweise auf einem mobilen Bildschirm dargestellt werden kann. Wenn Sie eine standortbasierte App entwickeln, können Sie eine Karte anzeigen, in der der Benutzer einen Hotspot angibt, und Sie verwenden Geoqueries, um nur Elemente um diesen Ort anzufordern.
+0

In Geofire-Bibliothek mochte ich die Tatsache, dass es alle Schlüssel sofort abruft, aber in der Regel benötigt jeder einen Rückruf für, wenn es fertig ist, Daten für einen bestimmten Ort abzurufen. –

+0

Auf Ihrem 3. Punkt möchte ich einige Beiträge zeigen, die neu sind, aber Geofire-Bibliothek gibt Rückruf für alle Elemente für x Speicherort gespeichert. Wenn also Tausende von Posts für den x-Ort verfügbar sind, gibt es Callback für alle ab dem ersten gespeicherten Eintrag, um nur kürzlich hinzugefügte Posts anzuzeigen, muss ich alle Callbacks durchgehen, den Schlüssel verwenden, um Firebase zu beziehen und Daten zu holen, Post-Zeit und Filter vergleichen entsprechend, die tatsächlich die gleiche Zeit nehmen wird, als alle Artikel zeigend, Es wird hilfreich sein, wenn Sie irgendeine empfohlene Weise zur Verfügung stellen können, dies zu tun. Vielen Dank im Voraus –

+0

Wenn Sie nur Artikel erhalten möchten, die aktuell sind, wie wäre es mit einem separaten Geo-Knoten für die letzten Artikel? Dies verhindert die Notwendigkeit einer clientseitigen Filterung, die die Bandbreitennutzung Ihres Benutzers drastisch reduziert. –