Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/207.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 运行以下代码时,为什么要运行6次?_Android_Firebase_Firebase Realtime Database - Fatal编程技术网

Android 运行以下代码时,为什么要运行6次?

Android 运行以下代码时,为什么要运行6次?,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我正在尝试运行这段代码,以便如果这些语句为真,那么应该会出现toastMessage,但根据日志,出于某种原因,它正在尝试运行toast 6次 当土司运行时,它会在每次运行时闪烁。我怎么能让祝酒词只运行一次 即使我用警告替换了烤面包,我也必须按“OK”6次,它才会消失 记录结果: checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZvpS80j1 checkForIOSRequests/riderId: xmmEHZJkOXOJbLXdCQjuZv

我正在尝试运行这段代码,以便如果这些语句为真,那么应该会出现toastMessage,但根据日志,出于某种原因,它正在尝试运行toast 6次

当土司运行时,它会在每次运行时闪烁。我怎么能让祝酒词只运行一次

即使我用警告替换了烤面包,我也必须按“OK”6次,它才会消失

记录结果:

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的运行次数增加一倍。