您所看到的可能是Firebase中的數據異步加載。第一次遇到這種情況,這是一個很大的範式轉變。但是由於大多數現代雲API都以這種方式工作,所以最好儘可能快地接受它。
我發現的時候看到我們把一些日誌語句會發生什麼最簡單的方法:
System.out.println("Before adding listener");
mRefReg.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("In onDataChange");
}
public void onCancelled(DatabaseError databaseError) { }
});
System.out.println("After adding listener");
相反的是你的直覺告訴你,這樣做的結果應該是:
Before adding listener
After adding listener
In onDataChange
原因是(正如我在開始時所說的)Firebase異步獲取數據庫中的數據。一個有趣的方式來實現這是爲了更改您的數據(例如在您的Firebase Database console中)。當你做出這種改變,onDataChange
將被再次調用並打印另一張:
In onDataChange
不幸的是,這意味着你不能做以下處理子女數:
int count = -1;
System.out.println("Before adding listener, count="+count);
mRefReg.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
count = dataSnapshot.getChildrenCount();
System.out.println("In onDataChange, count="+count);
}
public void onCancelled(DatabaseError databaseError) { }
});
System.out.println("After adding listener, count="+count);
因爲輸出將是:
Before adding listener: count=-1
After adding listener: count=-1
In onDataChange: count=3 (assuming you have 3 children)
我發現處理異步加載的最好方法是重新構造這個問題。不要說「首先我們得到點數,然後我們用它做xyz」,試着把它定義爲「每當我們點數時,用它做xyz」。這意味着你需要需要計數代碼移到onDataChange()
:
mRefReg.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
int count = dataSnapshot.getChildrenCount();
// TODO: show the count in the UI
}
public void onCancelled(DatabaseError databaseError) { }
});
如果要實現像這樣,在UI計數將更新每當更改數據庫的項目數。
爲什麼是「mCount = ...「不工作?如果mCount是你的匿名類以外定義的變量,它應該可以工作。你的身份的錯誤信息是什麼? – Oliver
Firebase最近發佈了雲端函數,看看這個[answer](http:// stackoverflow。 com/a/42713792/5861618) –