2

私は、すべてのメッセージをローカルSQLite DBとFirebaseリアルタイムDBの両方に保存するAndroidチャットアプリを持っています。Androidのfirebaseリスナーは、recyclerviewのonBindViewHolderの中にあります。

RecyclerViewにメッセージを表示すると、私は自分のローカルDBからそれらのメッセージを照会します(ローカルに保存されている追加データがあるため、リアルタイムDBには保存されません)。

リアルタイムのDBから取得した、表示されたメッセージの送信と読み取りのステータスをリアルタイムに更新する必要があります。

リサイクラービューのonBindViewHolder内の各メッセージに値イベントリスナーを設定しても問題ありませんか? 。

私は、現在画面に表示され、サーバーからのメッセージの全リストを取得していないメッセージの変化を聞くこの方法で(私が必要まさに)

2質問: - この解決方法は問題ないのですか、それとも良い方法がありますか? - リサイクラービューでは表示されていないアイテムのリスナーを削除する必要があります。それ、どうやったら出来るの?

私はFirebaseUIを使用していませんが(私の問題は解決していると思いますが)、ローカルデータベースのデータを表示し、サーバーからではなく、firebaseからの1つのフィールドの更新情報のみを取得します。リアルタイムDB。

答えて

1

この解決方法は問題ありませんか、それとも良い方法がありますか?

はい、いいえ! FirebaseUIをお勧めしますが、これは間違いなく最適なオプションですが、あなたは既にそれを使用したくないと述べています。 FirebaseUIを使用しないという事実を考えると、これが最善の選択肢のようです。 [正確な答えを与えることができるFirebaseの人々から直接これについてのレビューをすることをお勧めします。]また、ビューが画面から出てきたらコールバックを削除しないと、何百と何千ものリスナーと(ほとんどの人が冗長)宙に浮かんで、メモリを食べることは本当に何もしません。

リサイクラービューでは表示されていないアイテムのリスナーを削除する必要があります。それ、どうやったら出来るの?

かなり簡単です。 onViewDetachedFromWindow(MyViewHolder holder)メソッドrecyclerViewを使用すると、ビューから取り除かれようとしているハンドラーが得られます。このコールを使用すると、コールバックを削除できます。

どのようにですか?

followRef.removeEventListener(followListener); 

問題は次のとおりです。 - 場所から削除するには、コールバックの参照が必要です。あなたは2つの方法でこれを行うことができます。リスナーが多すぎる場合は、すべてのリスナーを追跡できる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); 
} 

コードは、私はこの質問に基づいて、それを書かれている、小さなエラーがある可能性があります。 Haventがテストしました。しかし、私はあなたがそのアイディアを得たことを願っています

問題:あなたはrecyclerViewを含むアクティビティを閉じると、機能onViewDetachedFromWindow(MyViewHolder holder)は上のアイテムのために呼び出されません:[でもこの事は、私はまだ見つけようとしている最善の解決策だ小さな問題がある]をその特定の時刻に画面に表示されます。したがって、アクティビティが終了するたびに、削除されないコールバック(画面上の表示アイテムの数と同じ)が残りません。

私は最近Firebaseデータベースに参加しました。答えに対する改善/提案は歓迎されます。

関連する問題