Firebase как удалить ValueEventListeners, когда другие действия открываются в Android - PullRequest
2 голосов
/ 20 апреля 2020

Я редактирую вопрос для большей ясности

В моем Activity A я запустил свой новый Activity B для определенного условия. В действии А есть следующее:

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());
            }
        });

`

В fragment Af также раздувается Activity A

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

Во Фрагменте А также 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);

Здесь reff и listener объявлены глобально.

Когда я уничтожаю Activity A, я хочу удалить слушателя в Activity A и Fragment Af.

Как я могу это сделать?

Если я изменяю какое-либо значение базы данных на какое-то другое Activity X, Activity A автоматически запускается из-за этих ValueEventListener, которые мне не нужны.

Ответы [ 2 ]

3 голосов
/ 20 апреля 2020

Удалите слушателя в вашей onDestroy() активности A

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

И вашей активности A в фоновом режиме при открытой активности B и если вы хотите удалить слушателя, то удалите слушателя в onPause() и добавьте слушателя в onResume()

0 голосов
/ 20 апреля 2020

У меня есть ответ на проблему. Там был один предыдущий Activity O, который я пропустил, чтобы удалить EventListener, который тайно запускал Activity A.

Потребовалось время, чтобы понять, что

...