AddValueEventListener在后台多次调用

时间:2017-11-18 17:39:26

标签: android firebase firebase-realtime-database

这是我的代码:

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    ValueEventListener userNavListener = new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            Log.v(Tag, "Called Multiple Times");
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    };

    mDatabase.addValueEventListener(userNavListener);
}  

我想要的是什么:
- 在背景上应用 addValueEventListener 的单个实例 - 因此,我想要使用 onDestroy()方法

如果我执行此操作,问题是 Log.v 多次打印数据只会改变一次
    - 我打开申请表,
    - 我再次关闭申请,
    - 我再次打开申请,
    - 然后出现问题, onDataChange 日志打印三次

有什么办法可以防止这种情况发生吗?

感谢您抽出时间阅读此问题,如果您知道答案,请回答我的问题。

2 个答案:

答案 0 :(得分:2)

您必须在不再需要时删除eventListeners。

安全的地方是onDestroy()

@Override
public void onDestory() {
    if (mDatabase!= null && userNavListener!= null) {
        mDatabase.removeEventListener(userNavListener);
    }
}

答案 1 :(得分:0)

如果您只想听一次,请使用addListenerForSingleValueEvent代替ValueEventListener

addListenerForSingleValueEvent只读取一次数据。所以你可以像这样使用它:

mDatabase.addListenerForSingleValueEvent(userNavListener)