Android 运行以下代码时,为什么要运行6次?
我正在尝试运行这段代码,以便如果这些语句为真,那么应该会出现toastMessage,但根据日志,出于某种原因,它正在尝试运行toast 6次 当土司运行时,它会在每次运行时闪烁。我怎么能让祝酒词只运行一次 即使我用警告替换了烤面包,我也必须按“OK”6次,它才会消失 记录结果:Android 运行以下代码时,为什么要运行6次?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在尝试运行这段代码,以便如果这些语句为真,那么应该会出现toastMessage,但根据日志,出于某种原因,它正在尝试运行toast 6次 当土司运行时,它会在每次运行时闪烁。我怎么能让祝酒词只运行一次 即使我用警告替换了烤面包,我也必须按“OK”6次,它才会消失 记录结果: checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1 checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZv
checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1
checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1
checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1
checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1
checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1
checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1
requestToastMessage
requestToastMessage
requestToastMessage
requestToastMessage
requestToastMessage
requestToastMessage
检查请求
iosRequests.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
riderId = ds.getKey();
Log.e(TAG, "checkForIOSRequests/riderId: " + riderId);
iosRequests.child(riderId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if (dataSnapshot.child("status").getValue() != null) {
if (dataSnapshot.child("isIOSRider").getValue() != null) {
String isIOSRider = (String) dataSnapshot.child("isIOSRider").getValue();
String onlineStatus = (String) dataSnapshot.child("status").getValue();
if (isIOSRider.equals("true") && onlineStatus.equals("requested")) {
requestToastMessage();
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
编辑
DatabaseReferene rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference iosRequests = rootRef.child("RideRequests");
编辑2
当我运行以下代码时,它会像日志结果一样运行6次
iosRequests.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
riderId = ds.getKey();
iosRequests.child(riderId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int size = (int) dataSnapshot.getChildrenCount();
Log.e(TAG, "children count = " + size);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
记录结果
iosRequests.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
riderId = ds.getKey();
iosRequests.child(riderId).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
int size = (int) dataSnapshot.getChildrenCount();
Log.e(TAG, "children count = " + size);
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
我只是不知道,当您可以使用一个数据库查询进行筛选时,为什么要使用两个数据库调用 只需使用下面的查询,就可以使用
isIOSRider
键过滤掉所有IOSRider
DatabaseReferene rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference iosRequests = rootRef.child("RideRequests");
Query queryIOSRiders = iosRequests.orderByChild("isIOSRider").equalTo(true);
// Keep in mind that, if you are storing boolean value in database then only use true in equalTo(...). i.e. equalTo(true)
// Else use true covered with quotes. i.e. equalTo("true")
并调用数据库
queryIOSRiders. addListenerForSingleValueEvent(...)
这个查询返回所有iOS骑士列表,所以之后需要放上简单的if-else大括号以筛选出合适的骑士
例如,您的最终结果处理代码应该如下所示:
queryIOSRiders.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue()!= null) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
if (ds.child("status").getValue() != null) {
String onlineStatus = (String) ds.child("status").getValue();
if (onlineStatus.equals("requested")) {
requestToastMessage();
}
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
我只是不知道,当您可以使用一个数据库查询进行筛选时,为什么要使用两个数据库调用 只需使用下面的查询,就可以使用
isIOSRider
键过滤掉所有IOSRider
DatabaseReferene rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference iosRequests = rootRef.child("RideRequests");
Query queryIOSRiders = iosRequests.orderByChild("isIOSRider").equalTo(true);
// Keep in mind that, if you are storing boolean value in database then only use true in equalTo(...). i.e. equalTo(true)
// Else use true covered with quotes. i.e. equalTo("true")
并调用数据库
queryIOSRiders. addListenerForSingleValueEvent(...)
这个查询返回所有iOS骑士列表,所以之后需要放上简单的if-else大括号以筛选出合适的骑士
例如,您的最终结果处理代码应该如下所示:
queryIOSRiders.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
if(dataSnapshot.getValue()!= null) {
for (DataSnapshot ds : dataSnapshot.getChildren()) {
if (ds.child("status").getValue() != null) {
String onlineStatus = (String) ds.child("status").getValue();
if (onlineStatus.equals("requested")) {
requestToastMessage();
}
}
}
}
}
@Override
public void onCancelled(DatabaseError databaseError) { }
});
ds
对象有多少子对象?@AlexMamo子对象数是15。请参阅文章编辑部分中新添加的RidereRequests节点图像。当运行我拥有的代码(请参阅编辑2中的代码)时,它会运行代码6次。ds
对象有多少子对象?@AlexMamo子对象计数为15。请参阅文章编辑部分中新添加的RidereRequests节点图像。当运行我的代码(请参阅编辑2中的代码)时,它会运行代码6次。我尝试按照您的建议执行操作,但没有任何结果。将addListenerForSingleValueEvent更改为addValueEventListener,它执行了它应该执行的操作,但运行了requestToastMessage 4x。还有,我不需要。需要先获取riderId吗?另外,如果我继续接受请求,当我转到另一个活动时,吐司将继续,并将requestToastMessage的运行次数增加一倍。我尝试按照您的建议执行,但没有发生任何事情。将addListenerForSingleValueEvent更改为addValueEventListener,它执行了它应该执行的操作,但运行了requestToastMessage 4x。还有,不是吗。需要先获取riderId吗?另外,如果我继续接受请求,当我转到另一个活动时,toast将继续,并将requestToastMessage的运行次数增加一倍。