2

我有一個Android聊天應用程序,它將所有消息存儲在本地SQLite數據庫和Firebase實時數據庫中。Android Firebase監聽器內部onBindViewHolder recyclerview

當在RecyclerView中顯示消息時,我從我的本地數據庫中查詢它們(因爲有一些額外的數據存儲在本地,而不是存儲在實時數據庫中)。

我需要實時更新顯示的消息發送和讀取狀態,這是我從實時數據庫中獲得的。

在回收站視圖的onBindViewHolder內爲每個消息設置一個值事件偵聽器會好嗎? 。

這樣我只聽當前顯示在屏幕上,並沒有得到來自服務器的消息的整個列表中的郵件的變化(正是我需要的)

2個問題: - 這個解決方案是否正確或有更好的方法? - 我需要刪除已在回收站視圖中看不到的項目的偵聽器。我怎麼做?

我不使用FirebaseUI(我知道它解決了我的問題),但我想從本地數據庫中提取數據,而不是從服務器中提取數據,並且只從Firebase的一個字段獲取更新實時數據庫。

回答

1

該解決方案是否正常或有更好的方法?

是,否!我會建議你使用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數據庫。歡迎任何對答案的改進/建議。