Wait Firebase async извлекает данные на Android

Мне нужно сохранить результат метода getBalue FireBase, который является асинхронным. Я не могу использовать что-то вроде «onPostExecute ()», и для моей цели я не могу выполнить всю свою операцию «в onDataChange ()», потому что мне нужны ссылки в будущем в других действиях.

Здесь мой fragment для извлечения данных:

List villages = new LinkedList(); Firebase ref = new Firebase("MYFIREBASEURL").child("village"); ref.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot snapshot) { spinnerArray.clear(); for (DataSnapshot postSnapshot : snapshot.getChildren()) { Village v = postSnapshot.getValue(Village.class); villages.add(v); } } @Override public void onCancelled(FirebaseError firebaseError) { System.out.println("The read failed: " + firebaseError.getMessage()); } }); 

Если я пытаюсь читать деревни из «onDataChange», у меня, естественно, для его асинхронной жизни нулевое значение. Есть способ гарантировать, что onDataChange был вызван ?.

Извините, если это не то, что вы хотите, потому что мой английский слишком плохой. Вы можете определить интерфейс прослушивателя для его обработки. Пример:

  public interface OnGetDataListener { public void onStart(); public void onSuccess(DataSnapshot data); public void onFailed(DatabaseError databaseError); } 

И я создаю пользовательскую функцию для получения данных в Database.class:

  public void mReadDataOnce(String child, final OnGetDataListener listener) { listener.onStart(); FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { listener.onSuccess(dataSnapshot); } @Override public void onCancelled(DatabaseError databaseError) { listener.onFailed(databaseError); } }); } 

Когда я хочу получить данные из Main.class, я делаю:

 private void mCheckInforInServer(String child) { new Database().mReadDataOnce(child, new OnGetDataListener() { @Override public void onStart() { //DO SOME THING WHEN START GET DATA HERE } @Override public void onSuccess(DataSnapshot data) { //DO SOME THING WHEN GET DATA SUCCESS HERE } @Override public void onFailed(DatabaseError databaseError) { //DO SOME THING WHEN GET DATA FAILED HERE } }); } 

Таким образом, вы можете повторно использовать свой метод и обрабатывать данные.

Чтобы добавить к ответу onStart() , можно было бы вызвать onStart() непосредственно перед

  FirebaseDatabase.getInstance().getReference().child(child).addListenerForSingleValueEvent(new ValueEventListener() { 

И в onStart() обычно вы показываете progressDialog:

  if (mProgressDialog == null) { mProgressDialog = new ProgressDialog(getContext()); mProgressDialog.setMessage(getString(R.string.loading)); mProgressDialog.setIndeterminate(true); } mProgressDialog.show(); 

И в onSuccess() диалог и загрузите данные в графический интерфейс (или что бы вы ни делали)

  if (mProgressDialog != null && mProgressDialog.isShowing()) { mProgressDialog.dismiss(); } 

Я понял, что вы пытаетесь сохранить данные моментальных снимков в переменной, но из-за задачи async переменная оказывается пустой, это связано с природой задачи async, что вы можете сделать, это передать данные моментального снимка из прослушивателя Firebase функцию для вашей пользовательской функции снаружи и хранить данные моментальных снимков в глобальной переменной. Затем вы можете использовать переменную так, как хотите.

  • Как сделать блокировку с несколькими чтениями / одиночной записью из более простых примитивов синхронизации?
  • Почему не логично синхронизировать логику?
  • Java Singleton и синхронизация
  • Чтение и запись C ++ int Atomic?
  • Как использовать свойство CancellationToken?
  • Синхронизированный блок Java для .class
  • В чем разница между синхронизированным методом и синхронизированным блоком в Java?
  • синхронизированный блок для объекта Integer
  • Синхронизированный блок Java против Collections.synchronizedMap
  • Как синхронизировать базу данных SQLite на телефоне Android с базой данных MySQL на сервере?
  • В чем разница между атомными / летучими / синхронизированными?
  • Давайте будем гением компьютера.