我在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()
吗?如何避免呢?
答案 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