Jerin
Jerin

Reputation: 801

Firebase how to ValueEventListeners remove when other activity open in Android

I'm editing the question for more clarity

In my Activity A, I have have started my new Activity B for certain condition. OnCreate of Activity A has the following

final DatabaseReference reff = FirebaseDatabase.getInstance().getReference("Example").child(userid);
        reff.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                if (dataSnapshot.exists()) {`
                    navHeaderName.setText(Objects.requireNonNull(dataSnapshot.child("name").getValue()).toString());
                    navHeaderId.setText(Objects.requireNonNull(dataSnapshot.child("member_ID").getValue()).toString());
                } else
                    reff.removeEventListener(this);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("RF-NavSet", databaseError.toString());
            }
        });

`

In the fragment Af is also si inflated in Activity A

FragmentManager fm = getSupportFragmentManager();
        fragment = new FragmentOfActiityA(); 
fm.beginTransaction().replace(R.id.doc_fragment_container, fragment).commit();

In Fragment A also I have Firebase ValueEventListener

listener = new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                TextView text1 = view.findViewById(R.id.some_text1);
                TextView text2 = view.findViewById(R.id.some_text2);
                TextView text3 = view.findViewById(R.id.some_text3);

                text1.setText(Objects.requireNonNull(dataSnapshot.child(userId).child("name").getValue()).toString());
                text2.setText(Objects.requireNonNull(dataSnapshot.child(userId).child("specialisation").getValue()).toString());
                text3.setText(Objects.requireNonNull(dataSnapshot.child(userId).child("member_ID").getValue()).toString());
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {
                Log.d("RF - SetProfile", databaseError.getMessage());
            }
        };

        reff.addListenerForSingleValueEvent(listener);

Here reff and listener are globally declared.

When I destroy Activity A, I want to remove listener in Activity A and Fragment Af.

How can I do that?

If I change any database value from some other Activity X, Activity A is automatically triggered due to these ValueEventListener which I dont want.

Upvotes: 3

Views: 735

Answers (2)

Jerin
Jerin

Reputation: 801

I have got the answer for the problem. There one previous Activity O which I missed to removeEventListener which was secretly launching Activity A.

Took a while to understand that

Upvotes: 1

Dinesh
Dinesh

Reputation: 1670

Remove the listener in your onDestroy() of activity A

mDatabaseRef.child(key).removeListener(mListener);

And your activity A in background when open activity B and if you want to remove listener then remove listener in onPause() and add listener in onResume()

Upvotes: 4

Related Questions