2017-06-01 3 views
0

Ich implementiere Firebase in meiner App. Bitte beziehen Sie sich auf das Bild unten als Referenz zu meiner Datenbank.ArrayList wird leer angezeigt, nachdem Daten aus der Firebase-Datenbank abgerufen wurden

The SLC Structure

Ich habe eine Reihe von SLC-Namen und ich brauche eine Arraylist von SLC Schlüssel zu erzeugen. Also versuche ich eine ArrayList mit bestimmten SLC-Schlüsseln zu erstellen. Bitte beachten Sie den folgenden Code einmal.

for (int i = 0; i < arr.size(); i++) 
{ 
    Query query = ref.child(pref.getString("groupSelectedDCU", "") + "/" + "DeviceList") 
        .orderByChild("name") 
        .equalTo(arr.get(i)); 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot child: dataSnapshot.getChildren()) 
      { 
       Log.d("arrID", child.getKey() + ""); 
       arrID.add(child.getKey()); 
      } 

      Log.d("arrID", Arrays.toString(arrID.toArray())); 
     } 

     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
     } 
    }); 
} 
Log.d("arrID", Arrays.toString(arrID.toArray())); 

Hier versuche ich, alle SLC-Tasten in den arrID Arraylist hinzuzufügen. Beim Zugriff auf die ArrayList wird jedoch ein leeres Array zurückgegeben. Fehle ich etwas oder muss ich noch mehr Zuhörer hinzufügen? Brauche deine Hilfe.

+0

Ist nicht JSON Basis basiert? – Zoe

+0

@LunarWatcher: Ja, es ist –

+0

Sie analysieren es richtig? – Zoe

Antwort

2

Sie missverstanden, wie addListenerForSingleValueEvent funktioniert. Die bereitgestellten ValueEventListener Methoden werden im Hintergrund asynchron aufgerufen, wenn die Abfrageantwort schließlich aus dem Netzwerk eintrifft. Als solcher, wenn diese letzte Aussage läuft (nach dem for-Schleife):

... 
Log.d("arrID", Arrays.toString(arrID.toArray())); 

die arrID wird noch leer sein, da keiner der onDataChange Methoden noch genannt wurde.

Alternative Lösung. Wenn Sie warten müssen, bis alle Abfragen fertig sind, versuchen Sie stattdessen:

List<String> arrID = ArrayList<String>(); 
int remainingQueries = arr.size(); 
for (int i = 0; i < arr.size(); i++) { 
    Query query = ... 
    query.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot dataSnapshot) { 
      for (DataSnapshot child: dataSnapshot.getChildren()) { 
       Log.d("arrID", child.getKey() + ""); 
       arrID.add(child.getKey()); 
      } 
      Log.d("arrID", Arrays.toString(arrID.toArray())); 
      if (--remainingQueries == 0) onQueriesDone(arrID); 
     } 
     @Override 
     public void onCancelled(FirebaseError firebaseError) { } 
    }); 
} 

, die diese Methode aufrufen, wenn Sie fertig:

private void onQueriesDone(List<String> arrID) { 
    Log.d("arrID", Arrays.toString(arrID.toArray())); 
} 

Insbesondere brauchen wir nicht Synchronisationssperren für den Zugriff auf den gemeinsamen Zähler remainingQueries, da alle Firebase-Callbacks im Hauptthread ausgelöst werden.

Verwandte Themen