在Android中等待Firebase异步检索数据

我需要存储他自己异步的FireBase getValue方法的结果。 我不能使用类似“onPostExecute()”的东西,为了我的目的,我无法执行我的所有操作“on onDataChange()”因为我需要在将来的其他活动中引用一些参考。

这是我的片段检索数据:

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

通过这种方式,您可以重用您的方法并处理数据。

只是为了增加Manh的答案,就可以在之前调用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()关闭对话框并将数据加载到GUI(或任何你想做的事情)

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

我的理解是你试图将快照数据保存到variables中,但是由于异步任务,variables结果为空,这是因为异步任务的性质,你可以做的是从firebase监听器传递快照数据函数到外部的自定义函数并将快照数据存储到全局variables中。然后您可以像想要的那样使用variables。