2017-06-08 13 views
1

私は火災基地で作業しており、私は何か変わったことに気づいた。 私がアクティビティに登録したバリューイベントリスナの1つが、アクティビティを終了した後でも起動されます。 'onDataChanged 'メソッドで新しいアクティビティを開くコードを追加しました。そのため、別のアクティビティでも新しいアクティビティが開かれます。これはアプリで大きな問題を引き起こしています。 私はリスナーを削除する必要があることを知っていますが、リスナーは、アクティビティが終了した後に自動的に削除されることが予想されます。私はアクティビティのすべてのバリューイベントリスナーを削除することができるより簡単な方法はありますか?前もって感謝します。アクティビティが終了した後でもFirebaseの値イベントリスナが起動しますか?

+0

Firebaseデータベースリスナーはコンテキストにバインドされていません。 Alexの答えのように、正しいアクティビティライフサイクルイベントでコード内で明示的に削除する必要があります。 –

+1

これをコンテキストに付加する方法はありますか?私は手動で行うのではなく、それぞれのアクティビティに多くのリスナーがいるので、私はそれをしたくありません。 –

+0

最新の回答をご覧ください。 –

答えて

3

メインアクティビティから離れるとリスナーを削除する必要があります。ただ応じremoveValueEventListener(hashMap);呼び出したより

hashMap.put(yourRef, eventListener); 

private HashMap<DatabaseReference, ValueEventListener> hashMap = new HashMap<>(); 
public static void removeValueEventListener(HashMap<DatabaseReference, ValueEventListener> hashMap) { 
    for (Map.Entry<DatabaseReference, ValueEventListener> entry : hashMap.entrySet()) { 
     DatabaseReference databaseReference = entry.getKey(); 
     ValueEventListener valueEventListener = entry.getValue(); 
     databaseReference.removeEventListener(valueEventListener); 
    } 
} 

あなたはリスタを削除するたびに、あなたのコード行を使用することができます、あなたはこのようなメソッドを作成することができることを行うためにアクティビティのライフサイクルまでこの行は、onPause()またはonStop()の方法で追加できます。このようにしての場合、一度にすべてのリスナーを削除できます

希望します。

+2

お返事ありがとうございますが、私はこれについて既に知っていました。私は、同時にすべてのリスナーを削除する他の方法があるかどうかを知りたいですか?手動で行うのは長い時間がかかるためです。 –

+0

はい、実際にはあります。私の更新された答えを見てください。 –

関連する問題