Могу ли я получить значение без использования прослушивателей событий в firebase на Android?

Я делаю приложение для Android, используя новую версию базы данных Google Firebase Realtime.

Я получаю свои данные с помощью ValueEventListener и ChildEventListener, когда данные изменяются / добавляются / удаляются / перемещаются и т. Д.

Теперь у меня проблема.

Мои данные:

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

И у меня есть кнопка, названная «getName».

Я хочу получить значение «имя» в данных пользователя 1, когда я нажал кнопку getName.

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

Является ли это возможным? Могу ли я получить значение без использования слушателей?

Im ждет ваших помощи. Спасибо.

Solutions Collecting From Web of "Могу ли я получить значение без использования прослушивателей событий в firebase на Android?"

Да, вы можете это сделать, используя addListenerForSingleValueEvent . Это будет извлекать значение только один раз, в отличие от ValueEventListener и ChildEventListener . Таким образом, ваш код будет выглядеть примерно так,

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

На самом деле это не изменится каждый раз, когда вы меняете данные, и это, вероятно, вызовет все ваши действия, которые довольно бесполезны, я даже не знаю, почему они сделали это именно так. Waiste of time.

Взгляните на структуру API задач :

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