Firebase如何在Android中打开其他活动时删除ValueEventListeners

3

我正在编辑问题以获得更明确的信息

在我的Activity A中,我为某些条件启动了我的新Activity B。 Activity A的OnCreate具有以下内容

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

Activity A中,片段 Af也被充气(inflated)。

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

在Fragment A中,我也有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);

这里全局声明了 refflistener

当我销毁活动 A 时,我想要删除在 Activity AFragment Af 中的监听器。

我该怎么做?

如果我从其他Activity X更改任何数据库值,则会自动触发Activity A,因为这些值事件监听器。但我不想这样。

2个回答

4

A活动的onDestroy()方法中删除监听器。

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

当你打开活动B时,你的活动A在后台运行,如果你想要移除监听器,则需要在onPause()中移除监听器,在onResume()中添加监听器。


@Jerin 如果你在 onPause() 中注册了监听器,那么需要在 onResume() 中移除,这意味着当其他活动打开时,首先会调用 onPause() 并注销你的 valueEventListener,因此在更改 Firebase 值后不会触发。如果你在 onCreate() 中注册,则需要在 onDestroy() 方法中移除。 - Dinesh
我已经更清楚地定义了问题,请仔细阅读。很抱歉,但我无法将您的答案与我的问题联系起来。 - Jerin

1
我已经找到了解决问题的答案。 之前有一个活动O,我忘记移除事件监听器,它在秘密启动活动A
花了一些时间才理解清楚。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接