該解決方案是否正常或有更好的方法?
是,否!我會建議你使用FirebaseUI,它絕對是最好的選擇,但你已經提到你不想使用它。因此,在不使用FirebaseUI的情況下,這似乎是最佳選擇。 [我建議您直接從Firebase人員那裏獲得有關此信息的評論,他們可以給出準確的答案。]您還應該知道,如果在視圖離開屏幕後不刪除回調,則會結束成千上萬的聽衆(大部分是多餘的)搖擺不定,吃掉了記憶。
我需要刪除已在回收站視圖中看不到的項目的偵聽器。我怎麼做?
很簡單。你可以使用方法recyclerView
它給你的處理程序即將從視圖中刪除。您可以使用此呼叫來移除回叫。
怎麼樣?
followRef.removeEventListener(followListener);
事情是 - 您需要一個回調的引用,以將其從該位置移除。你可以用兩種方法來做到這一點。如果您擁有太多不同的聽衆,您可以創建一個可以跟蹤所有聽衆的hashmap
。無論何時需要,您都可以獲取聽衆的參考信息並將其刪除。
另一種方法是:
@Override
public void onBindViewHolder(final MyViewHolder holder, int position) {
User user = data.get(position);
holder.name.setText(user.Name);
holder.surname.setText(user.Surname);
holder.id = user.id; //Id is same as the key used to point this user.
holder.followers.setText("Loading..");
DatabaseReference userFollowers = mRef.child(holder.id).child("Followers");
followListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
holder.followers.setText(String.valueOf(dataSnapshot.getValue()));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
};
userFollowers.addValueEventListener(followListener); //Adds a listener
}
@Override
public void onViewDetachedFromWindow(MyViewHolder holder) {
DatabaseReference followRef = mRef.child(holder.id).child("Followers");
followRef.removeEventListener(followListener); //Removes the listener
super.onViewDetachedFromWindow(holder);
}
的代碼可能有小錯誤,我已經根據這個問題寫的。未經測試。但我希望你明白了。
的問題:即使這件事有一個小問題,誰是最好的解決辦法我仍然試圖找到]:當您關閉包含recyclerView
活動,功能onViewDetachedFromWindow(MyViewHolder holder)
沒有得到要求的項目上在特定時間進行屏幕顯示。因此,無論何時recyclerView
活動結束,它都會保留少量回調(與屏幕上可見項目的數量相同)而不被移除。
即使我最近也進入了Firebase數據庫。歡迎任何對答案的改進/建議。