我正在使用Firebase實時數據庫存儲和檢索我的Android應用程序的數據。在我的活動中,我使用childEventListener
從Firebase檢索所有數據(例如:用戶數據列表)。瞭解Firebase上的childEventListener是否已完成加載所有數據
只要數據沒有從數據庫中完整檢索,我想顯示一個進度條。如何檢查所有數據是否完全檢索,以便在數據加載後關閉進度欄?
我正在使用Firebase實時數據庫存儲和檢索我的Android應用程序的數據。在我的活動中,我使用childEventListener
從Firebase檢索所有數據(例如:用戶數據列表)。瞭解Firebase上的childEventListener是否已完成加載所有數據
只要數據沒有從數據庫中完整檢索,我想顯示一個進度條。如何檢查所有數據是否完全檢索,以便在數據加載後關閉進度欄?
有一種常見的方法來檢測Firebase何時完成同步給定位置上的初始數據。這種方法利用了Firebase event guarantees之一:
值事件總是觸發的最後,並保證包含來自被採取快照之前發生的其他事件的更新。
因此,如果你同時擁有ValueEventListener
並在給定的位置ChildEventListener
,將ValueEventListener.onDataChange()
可以保證被稱爲後所有onChildAdded()
通話發生。您可以使用此當初始數據加載完成知道:
ref.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
System.out.println("We're done loading the initial "+dataSnapshot.getChildrenCount()+" items");
}
public void onCancelled(FirebaseError firebaseError) { }
});
ref.addChildEventListener(new ChildEventListener() {
public void onChildAdded(DataSnapshot dataSnapshot, String previousKey) {
System.out.println("Add "+dataSnapshot.getKey()+" to UI after "+previousKey);
}
public void onChildChanged(DataSnapshot dataSnapshot, String s) {
}
public void onChildRemoved(DataSnapshot dataSnapshot) {
}
public void onChildMoved(DataSnapshot dataSnapshot, String s) {
}
public void onCancelled(FirebaseError firebaseError) { }
});
在我的測試中運行這個結果:
Add -K2WLjgH0es40OGWp6Ln to UI after null
Add -K2YyDkM4lUotI12OnOs to UI after -K2WLjgH0es40OGWp6Ln
Add -K2YyG4ScQMuRDoFogA9 to UI after -K2YyDkM4lUotI12OnOs
...
Add -K4BPqs_cdj5SwARoluP to UI after -K4A0zkyITWOrxI9-2On
Add -K4BaozoJDUsDP_X2sUu to UI after -K4BPqs_cdj5SwARoluP
Add -K4uCQDYR0k05Xqyj6jI to UI after -K4BaozoJDUsDP_X2sUu
We're done loading the initial 121 items
所以,你可以使用onDataChanged()
事件隱藏進度條。
但有一點要記住:Firebase不只是加載數據。它連續同步數據從服務器到所有連接的客戶端。因此,數據完全沒有被檢索的時刻完全。
我以相當簡單的方式完成了它。我讓int計數,然後每當它進入函數內部時,我就增加它並檢查它是否等於孩子的總數。如果它相等那麼你可以停止進度條
int count = 0;
ref.addChildEventListener(new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String s) {
count++;
if(count >= dataSnapshot.getChildrenCount()){
//stop progress bar here
}
}
很好的答案!感謝您的回答。有用!你的答案真的很有用。但我想問一下,爲什麼addListenerForSingleValueEvent onDataChange仍然在引用中發生變化時調用?是addListenerForSingleValueEvent只調用一次然後它刪除或我是假的? –
當您使用'addListenerForSingleValueEvent()'添加偵聽器時,只會針對一個值事件調用它。之後,它會自動刪除。閱讀文檔中有關這些內容的更多信息:https://www.firebase.com/docs/android/guide/retrieving-data.html#section-reading-once –
因此,每次調用onDataChange()時都會引用in Firebase被更改或添加?或者只調用一次然後偵聽器被刪除?因爲當我使用'addListenerForSingleValueEvent()'時,'onDataChange()'被調用後,偵聽器不會從引用中移除,並且當我在引用中添加新值時,調用'onDataChange()'再次。 –