Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/205.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 为什么添加值时不会触发这些ValueEventListeners?_Android_Firebase_Firebase Realtime Database_Event Listener - Fatal编程技术网

Android 为什么添加值时不会触发这些ValueEventListeners?

Android 为什么添加值时不会触发这些ValueEventListeners?,android,firebase,firebase-realtime-database,event-listener,Android,Firebase,Firebase Realtime Database,Event Listener,代码如下所示: msgRef.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot dataSnapshot1) { ms = dataSnapshot1.getValue(String.class); flag1++; Log.i("flag1", String.valueO

代码如下所示:

msgRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
        ms = dataSnapshot1.getValue(String.class);
        flag1++;
        Log.i("flag1", String.valueOf(flag1));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});

FuidRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
        fUid = dataSnapshot2.getValue(String.class);
        flag2++;
        Log.i("flag2", String.valueOf(flag2));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});

secretRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
        st = dataSnapshot3.getValue(String.class);
        flag3++;
        Log.i("flag3", String.valueOf(flag3));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});
final DatabaseReference TuidRef=usersRef.child(td);
最终数据库参考msgRef=TuidRef.child(“rec_msg”);
最终数据库引用FuidRef=TuidRef.child(“fromUID”);
最终数据库引用secretRef=TuidRef.child(“rec_secret”);
msgRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(@NonNull DataSnapshot dataSnapshot1){
ms=dataSnapshot1.getValue(String.class);
flag++;
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
FuidRef.addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot dataSnapshot2){
fUid=dataSnapshot2.getValue(String.class);
flag++;
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
secretRef.addValueEventListener(新的ValueEventListener(){
@凌驾
公共void onDataChange(@NonNull DataSnapshot dataSnapshot3){
st=dataSnapshot3.getValue(String.class);
flag++;
}
@凌驾
已取消的公共void(@NonNull DatabaseError DatabaseError){
}
});
字符串flagS=“”+标志;
Log.i(“旗帜”,旗帜);
如果(标志>2)
displayMessage();
我使用该标志来了解触发
ValueEventListeners
的次数,但在日志中发现该标志为0

td
是接收消息的人的
uid
。在下图中,它与其他兄弟子女的父密钥相同

当没有消息时,数据库看起来像这样:

收到消息时,数据库如下所示:

编辑:当三个侦听器同时被触发时,如何执行函数
displayMessage()


但是,该值会同时添加到firebase数据库中的所有三个值。

您永远不会知道一个
ValueEventListeners
以do的方式触发了多少次,因为
标志的值将始终保持
0
。发生这种情况的原因是
onDataChange()
方法的异步行为,甚至在您试图从数据库获取数据之前就调用了该方法。实际情况是,您试图从数据库中获取数据并立即尝试记录它,而
标志
变量的初始值为
0
。然后,当从数据库获取数据完成时,它会更改标志的值,但不再读取

此问题的快速解决方法是在每个回调中添加三个不同的标志,然后尝试在
onDataChange()
方法中单独记录,如下所示:

msgRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
        ms = dataSnapshot1.getValue(String.class);
        flag1++;
        Log.i("flag1", String.valueOf(flag1));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});

FuidRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
        fUid = dataSnapshot2.getValue(String.class);
        flag2++;
        Log.i("flag2", String.valueOf(flag2));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});

secretRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
        st = dataSnapshot3.getValue(String.class);
        flag3++;
        Log.i("flag3", String.valueOf(flag3));
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});
如果您需要在代码中获取
onDataChange()
方法之外的该标志的值,我建议您查看此中anwser的最后一部分,其中我已经解释了如何使用自定义回调来完成该操作。您还可以查看此,以便更好地理解

编辑:

msgRef.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(@NonNull DataSnapshot dataSnapshot1) {
        ms = dataSnapshot1.getValue(String.class);
        flag++;

        FuidRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                fUid = dataSnapshot2.getValue(String.class);
                flag++;

                secretRef.addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(@NonNull DataSnapshot dataSnapshot3) {
                        st = dataSnapshot3.getValue(String.class);
                        flag++;
                        Log.i("flag", String.valueOf(flag));
                    }

                    @Override
                    public void onCancelled(@NonNull DatabaseError databaseError) {}
                });
            }

            @Override
            public void onCancelled(@NonNull DatabaseError databaseError) {}
        });
    }

    @Override
    public void onCancelled(@NonNull DatabaseError databaseError) {}
});

这是否意味着永远不会执行
displayMessage()
?我想在这三个函数全部更改时执行此函数,如何执行?是的,没错,
displayMessage()
方法将永远不会执行。如果希望将所有标志都放在一个
标志中
,则应使用嵌套侦听器,如我的更新答案中所示。它有用吗?