我是Firebase的新手,正在從事簡單的項目。我有一種方法可以從Firebase獲取教師名單,並將他們的電子郵件添加到ArrayList並返回。等待,直到完成onChildAdded在firebase querys,Android
public ArrayList<String> 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<String,Object> value = (Map<String, Object>) 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 /老師:{數= 1,姓名=老師,[email protected],主題=物理}
d/ENTRY:DATA [email protected]
有沒有辦法等到完全是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<String, Object> value = (Map<String, Object>) 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;
}
等待異步操作是浪費線程。但是,如果你堅持:我的答案在這裏會告訴你兩個選項:http://stackoverflow.com/questions/33203379/setting-singleton-property-value-in-firebase-listener –
先生,我讀你的文章,並嘗試在你的辦法。但是這並沒有幫助我。調用此方法後程序沒有處理。有什麼建議麼..? –
我很確定我寫的代碼的作品。但對你而言,好消息是你可以隨時服用該答案中提到的紅色藥丸。無論如何,這是更好的方法。 –