2016-06-04 11 views
5

Robię aplikację dla systemu Android przy użyciu nowej wersji bazy danych Google Firebase Realtime.Czy mogę uzyskać wartość bez używania detektorów zdarzeń w firebase na Androida?

jestem coraz moje dane teleadresowe z ValueEventListener i ChildEventListener gdy dane zmienione/dodane/usunięte/przeniesione etc ..

Teraz mam problem.

Moje dane to:

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

i mam Button, który nazywa się "getName".

Chcę uzyskać wartość "name" w danych użytkownika 1 po kliknięciu przycisku getName.

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

Czy to możliwe? Czy mogę uzyskać wartość bez korzystania ze słuchaczy?

Czekam na pomoc. dziękuję.

+0

Może szukasz [czytaj dane raz] (https://firebase.google.com/docs/database/android/retrieve-data#read_data_once) – Aladin

Odpowiedz

6

Tak, możesz to zrobić, używając addListenerForSingleValueEvent. Spowoduje to pobranie wartości tylko raz w przeciwieństwie do ValueEventListener i ChildEventListener. Tak Twój kod będzie wyglądać tak,

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

Nie rzeczywiście prawda, że ​​zmieni każdorazowej zmianie danych i będzie prawdopodobnie nazywać wszystkich aktywnosci który jest całkiem bezużyteczny i nawet nie wiem dlaczego zrobiłem to w ten sposób .... waiste czasu.

1

Spójrz na 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(); 
} 
Powiązane problemy