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

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

Здесь мой фрагмент для извлечения данных:

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