Firebase不会在数据更改时检索最后的数据,并且无法以正确的方式在addValueEventListener内部执行条件

问题描述 投票:0回答:1

我正在尝试根据数据库中值的条件在addValueEventListener中执行一些代码,但是当数据更改时,侦听器将根据旧数据执行条件,第二次尝试侦听器将执行我要使用的数据。但是,数据更改侦听器执行listener(-1)数据。更明确地说,如果存在“禁用”或“停止”子代,我不想执行代码,但是在更新数据且这些子代不存在后,我调用AddMessage方法的条件不再执行,而是执行了当我第二次打电话时,它可以正常执行,直到下次更新数据时,它再次从同一问题开始。

sendMessage.setOnClickListener(new View.OnClickListener() {@Override
    public void onClick(View v) {
        AddMessage();
    }
});

private void AddMessage() {
    nListener = RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            if (dataSnapshot.exists()) {
                if (!dataSnapshot.hasChild("disable") && !dataSnapshot.hasChild("stop")) {
                    HashMap <String,String> chatMessageMap = new HashMap <>();
                    chatMessageMap.put("from", messageSenderID);
                    chatMessageMap.put("type", "check");
                    chatMessageMap.put("content", messageText);
                    MessagesRef.child(messageReceiverID).push().setValue(chatMessageMap);
                    RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).removeEventListener(nListener);
                } else {
                    RootRef.child("List Ref").child(messageReceiverID).child(messageSenderID).removeEventListener(nListener);
                }
            }
        }

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

        }
    });
}

“”

java android firebase firebase-realtime-database
1个回答
0
投票
sendMessage.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

        String stoppedUser;

        myDbref = FirebaseDatabase.getInstance().getReference().child("List Ref").child(<UID_OF_RECEIVER_OF_MESSAGE>);
        myDbref.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            try {
                stoppedUser = dataSnapshot.child(<UID_OF_SENDER>).child("stop").getValue().toString();

            }catch (Throwable e){
                Toast.makeText(getApplicationContext(), e.toString(), Toast.LENGTH_SHORT).show();
            }
        }

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

        }

        //Now use if-else statement
        if(<UID_OF_RECEIVER> == stoppedUser){
            Toast.makeText(getApplicationContext(), "You are blocked.", Toast.LENGTH_LONG).show();
        } else {
            AddMessage();
        }

    });
© www.soinside.com 2019 - 2024. All rights reserved.