onDataChange意外行为

时间:2018-11-30 21:31:51

标签: android firebase

我在FirstActivity.java上有以下代码:

    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        FirebaseUser user = FirebaseAuth.getInstance().getCurrentUser();
        if (data == 0) {                
            Intent intent = new Intent(getApplicationContext(), ThirdActivity.class);
            startActivity(intent);
            finish();
        } 
}

并在SecondActivity.java上更新data值,并且它在更新后立即启动ThirdActivity,尽管我从未在SecondActivity和我怀疑是因为它发生在FirstActivity.java上(这是我重定向到该活动的唯一位置)。但是我打电话给finish(),那么这个onDataChange是如何从另一个活动中触发的呢?是因为getApplicationContext()吗?如何避免呢?

2 个答案:

答案 0 :(得分:0)

当您在Firebase中监听“实时更新”时,将分配一个“监听器”。该侦听器是用于“监听”更改的呼叫的注册。您必须手动进行管理,并在完成后分离或删除侦听器。

This是用于管理侦听器的Firebase文档。

这是示例之一:

Query query = db.collection("cities");
ListenerRegistration registration = query.addSnapshotListener(
    new EventListener<QuerySnapshot>() {
      // ...
    });

// ...

// Stop listening to changes
registration.remove();

您的怀疑是正确的,即使您呼叫finish(),该监听器仍已注册监听。因此,您只需要在最初拨打电话时抓住侦听器,然后在继续进行下一个活动之前将其“删除”即可。


以我的示例进行编辑

我的应用程序中有一个文档更改侦听器。因此,在我的活动中,我在活动级别分配了侦听器变量:

public class AMainScreen extends FragmentActivity {

...

private ListenerRegistration listenerRegistration;

...

}

然后我打电话听文档并分配听众:

listenerRegistration = FirebaseFirestore.getInstance().collection(collectionName).document(documentId).addSnapshotListener(new EventListener<DocumentSnapshot>() {
        @Override
        public void onEvent(@Nullable DocumentSnapshot documentSnapshot, @Nullable FirebaseFirestoreException e) {
            if (e != null) {
                /// handle error
            } else {
                if (documentSnapshot != null && documentSnapshot.getData() != null) {
                    /// handle document snapshot
                } else {
                    /// handle docSnapshot null
                }
            }
        }
     }));

然后,您只需在完成后在监听器上调用remove()

@Override
protected void onStop() {
    if (listenerRegistration != null) {
        listenerRegistration.remove();
    }
    super.onStop();
}

希望这会有所帮助。

答案 1 :(得分:0)

可能使用方法addValueEventListener(),此方法在后台是侦听器,例如,如果您在RealTimeDatabase中引用了该路由,它将一直侦听直到删除侦听器为止;否则,您仅我建议使用addListenerForSingleValueEvent()后,需要启动查询。

在这里您将找到所有必需的文档:reconnecting-websocket