0

我有以下代码,在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();
        } 
}

和 on SecondActivity.java,我更新data值,并ThirdActivity立即开始更新,尽管我从未调用在 中启动此活动,SecondActivity 并且我怀疑这是由于它正在发生的事实FirstActivity.java(这是我重定向到该活动的唯一地方)。但是我打电话finish(),那怎么会onDataChange是由另一个活动触发的呢?是因为getApplicationContext()可能吗?如何避免?

4

2 回答 2

0

可能使用方法addValueEventListener(),这个方法是一个后台的监听器,例如如果你引用它到你的RealTimeDatabase中的一个路由,它会一直监听直到你移除监听器,另一方面你只需要启动一次查询我推荐使用 addListenerForSingleValueEvent()。

在这里您可以找到所有必需的文档:https ://firebase.google.com/docs/database/android/read-and-write

于 2018-12-01T01:11:01.940 回答
0

当您在 Firebase 中监听“实时更新”时,会分配一个“监听器”。此侦听器是对“侦听”更改的调用的注册。您必须手动管理它并在完成后分离或删除侦听器。

是用于管理侦听器的 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();
}

希望这会有所帮助。

于 2018-11-30T21:41:28.943 回答