Firebase數據庫用戶知道有兩個用於監聽Data的基本偵聽器:ValueEventListener和ChildEventListener。當我們傾聽一個對象時,它非常有效,但是當我們傾聽一些對象時變得相當困難。Android中的RecyclerView的ValueEventListener vs ChildEventListener
要指定問題,我們假設我們有HackerNews提要,並且我們會聽取例如Firebase中的「帖子」對象。
當然,我們在我們的應用程序中顯示帖子的RecyclerView,我認爲好的想法會使用FirebaseUI,但問題是我們想在更改服務器端或測試的情況下製作更抽象的應用程序。所以我們會使用一些適配器,但這是另一個question。
我們有兩位聽衆,正如我提到的,問題是哪個更好?
當我們使用ValueEventListener時,我們將獲得整個集合,但是如果有任何更改,就像一個用戶更改了帖子的內容,我們將不得不重新加載整個數據,這意味着通過昂貴的網絡傳輸發送更多字節。另一個問題是,當我們的用戶multilisteners,這裏是例子:
郵政有用戶id,但我們要顯示他的名字,所以在
onDataChanged
方法,我們有獲取用戶數據,像這樣:postsReference.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { for (DataSnapshot data : dataSnapshot.getChildren()) { Post post = data.getValue(Post.class); usersReference.child(post.getUserId()).addListenerForSingleValueEvent(new ValueEventListener() { @Override public void onDataChange(DataSnapshot dataSnapshot) { // Here we have user data } @Override public void onCancelled(FirebaseError firebaseError) { } }); } } @Override public void onCancelled(FirebaseError firebaseError) { } });
您可以看到,現在我們必須將每個帖子分別添加到RecyclerView中,這會讓我們知道我們應該使用ChildEventListener。
因此,現在當我們使用ChildEventListener時,問題是一樣的 - 我們必須將每個帖子分別添加到RecyclerView中,但是當有人更改帖子內容時,Firebase只會向我們發送這一帖子,這意味着通過網絡傳輸的數據更少。
我們不喜歡將文章分別添加到RecyclerView,因爲例如: - 很難添加加載指示符,因爲我們不知道所有數據何時到達。 - 用戶不斷刷新視圖,而新帖子而不是整個列表變得可見。 - 很難對這個集合進行排序,我們必須在適配器中這樣做。
問題
比我上面寫的什麼是使用火力與收集的最佳做法,也許更好的解決方案?
編輯
數據方案是這樣的:
"posts" : {
"123456" : {
"createdAt" : 1478696885622,
"content" : "This is post content",
"title" : "This is post title",
"userId" : "abc"
},
"789012" : {
"createdAt" : 1478696885622,
"content" : "This is post content 2",
"title" : "This is post title 2",
"userId" : "efg"
}
}
"users" : {
"abc" : {
"name" : "username1"
},
"efg" : {
"name" : "username2"
}
}
EDIT 2
我犯了一個錯誤 - >火力地堡不ValueEventListener獲取整個數據如果有什麼東西改變。它只得到「delta」,here就是證明。
你能告訴我你的數據庫模式? –
我編輯的問題。 – ThirdMartian
沒有你提到的那些。 [Firebase UI]中的FirebaseRecyclerAdapter(https:// github。com/firebase/FirebaseUI-Android)在這種情況下是最好的 –