2016-06-04 1 views
5

Ich erstelle eine Android-Anwendung mit einer neuen Version der Google Firebase Realtime Database.Kann ich Wert erhalten, ohne Event-Listener in Firebase auf Android zu verwenden?

ich meine Daten mit ValueEventListener und ChildEventListener bekommen, wenn Daten geändert/hinzugefügt/gelöscht/verschoben etc ..

Nun habe ich ein Problem.

Meine Daten:

"user 1": { 
    "name":"abc" 
} 

und ich habe eine eine Taste, die "getName" genannt.

Ich möchte Wert von "Name" in Benutzer 1 Daten erhalten, wenn ich auf die Schaltfläche getName geklickt habe.

getName.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      bla bla.. 
     } 
    }); 

Ist es möglich? Kann ich Wert ohne Zuhörer erhalten?

ich warte auf Ihre Hilfe. danke.

+0

Vielleicht Sie suchen [lesen Daten einmal] (https://firebase.google.com/docs/database/android/retrieve-data#read_data_once) – Aladin

Antwort

6

Ja, Sie können das tun, indem Sie addListenerForSingleValueEvent verwenden. Dies wird den Wert nur einmal im Gegensatz zu ValueEventListener und ChildEventListener abrufen. So Ihr Code in etwa so aussehen,

getName.setOnClickListener(new View.OnClickListener() { 
    @Override 
    public void onClick(View v) { 
     ref.addListenerForSingleValueEvent(new ValueEventListener() { 
     @Override 
     public void onDataChange(DataSnapshot snapshot) { 
      // do some stuff once 
     } 
     @Override 
     public void onCancelled(FirebaseError firebaseError) { 
     } 
}); 
6

nicht wirklich wahr wird es jedes Mal, wenn die Daten ändern ändern und es wird wahrscheinlich alle Ihre Aktivitäten nennen, welche ziemlich nutzlos ist, ich weiß nicht einmal, warum sie so gemacht .... waiste der zeit.

1

Werfen Sie einen Blick auf Tasks API framework:

@Override 
public void onClick(View view) { 
    getUser(); 
} 

private Task<User> getUser(String id) { 
    final TaskCompletionSource<User> tcs = new TaskCompletionSource(); 

    ref.child("users") 
     .child(id) 
     .addListenerForSingleValueEvent(new ValueEventListener() { 

      @Override 
      public void onCancelled(FirebaseError error) { 
       tcs.setException(error.toException()); 
      } 

      @Override 
      public void onDataChange(DataSnapshot snapshot) { 
       tcs.setResult(snapshot.getValue(User.class)); 
      } 

     }); 

    return tcs.getTask(); 
}