等到完成onChildAdded in firebase querys,Android

我是Firebase的新手并致力于简单的项目。 我有一种方法可以从Firebase获取教师列表,并将他们的电子邮件添加到ArrayList并返回。

public ArrayList getTeacherList() { temp = new ArrayList(); Firebase node = ref.child("teachers"); Query query = node.orderByChild("subject").equalTo(selected_subject); query.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Map value = (Map) dataSnapshot.getValue(); Log.d("TEACHER"," "+value.toString()); Iterator entries = value.entrySet().iterator(); while (entries.hasNext()) { Map.Entry thisEntry = (Map.Entry) entries.next(); String key = (String) thisEntry.getKey(); Object data = thisEntry.getValue(); if(key.equals("email")) { temp.add(data.toString()); Log.d("ENTRY",": DATA "+data.toString()); } } } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(FirebaseError firebaseError) { } }); Log.d("RETURN", temp.toString()); return temp; } 

这种方法工作正常。 但问题是在完成添加子项之前返回temp变量。

例如我的Android监视器是这样的:

D / RETURN:[]

D /老师:{number = 1,姓名=老师,email = teacher @ new.lk,subject = Physics}

D / ENTRY :: DATA teacher@new.lk

有没有办法等到完成onChildAdded方法..?

================================================== =======================

我也试过这种方式。 但后来它停在了内部方法。

即使它没有去Log.d("TEACHER", " " + value.toString()); 在这里标记。

 public ArrayList getTeacherList() throws InterruptedException { temp = new ArrayList(); Firebase node = ref.child("teachers"); Query query = node.orderByChild("subject").equalTo(selected_subject); semaphore = new Semaphore(0); query.addChildEventListener(new ChildEventListener() { @Override public void onChildAdded(DataSnapshot dataSnapshot, String s) { Map value = (Map) dataSnapshot.getValue(); Log.d("TEACHER", " " + value.toString()); Iterator entries = value.entrySet().iterator(); while (entries.hasNext()) { Map.Entry thisEntry = (Map.Entry) entries.next(); String key = (String) thisEntry.getKey(); Object data = thisEntry.getValue(); if (key.equals("email")) { setArrayList(data.toString()); Log.d("ENTRY", ": DATA " + data.toString()); } } semaphore.release(); } @Override public void onChildChanged(DataSnapshot dataSnapshot, String s) { } @Override public void onChildRemoved(DataSnapshot dataSnapshot) { } @Override public void onChildMoved(DataSnapshot dataSnapshot, String s) { } @Override public void onCancelled(FirebaseError firebaseError) { } }); semaphore.acquire(); return temp; } 

 public class MainActivity extends AppCompatActivity{ public static Bus bus; protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); bus = new Bus(ThreadEnforcer.MAIN); bus.register(this); //CALL TO LOAD DATA FROM FIREBASE loadData(); } private void loadData(){ DatabaseReference mDatabase = FirebaseDatabase.getInstance().getReference(); mDatabase.child("my-data").addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { //CREATE YOUR OWN OBJECT USING RECEIVED DATA MyObject o = new MyObject(); //CALL FOR METHOD nextMethod() bus.post(o); } @Override public void onCancelled(DatabaseError databaseError) { Log.d("Error", databaseError.toString()); } }); } @Subscribe private void nextMethod(MyObject o){ } } 

这是使用otto – EventBus的一个非常基本的例子。 从bus.post(o) ,您可以调用bus.post(o)订阅方法。

解决:我使用了http://square.github.io/otto/上的 Otto EventBus Library,它对我有用