2016-06-04 3 views
5

새로운 버전의 Google Firebase Realtime Database를 사용하여 Android 애플리케이션을 만들고 있습니다. 데이터가 변경 될 때안드로이드의 firebase에서 이벤트 리스너를 사용하지 않고도 가치를 얻을 수 있습니까?

내가 ValueEventListener와 ChildEventListener 내 datas를 받고 있습니다/추가/삭제/이동 등

지금, 나는 문제가있다.

내 데이터는 다음과 같습니다

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

와 나는 "대한 getName"라는 버튼이 있습니다.

getName 버튼을 클릭하면 사용자 1 데이터에서 "name"의 값을 가져오고 싶습니다.

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

가능합니까? 리스너를 사용하지 않고도 가치를 얻을 수 있습니까?

귀하의 도움을 기다리고 있습니다. 감사합니다.

+0

어쩌면 당신이 찾고있는 [데이터를 읽고 한 번] (https://firebase.google.com/docs/database/android/retrieve-data#read_data_once) – Aladin

답변

6

addListenerForSingleValueEvent을 사용하면됩니다. 이 값은 ValueEventListenerChildEventListener과 달리 한 번만 가져옵니다. 그래서 다음과 같이 보일 것입니다 코드, 실제로

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

하지 진정한 당신이 데이터를 변경할 때마다 변경되며, 아마 꽤 쓸모있는 당신의하는 행동이 모든 호출은 내가 알지도 못하는 왜 그렇게 만들었지 .... 시간 낭비.

1

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(); 
}