为什么在首次发送消息时重复在聊天应用程序中发送的消息?

时间:2018-08-23 08:58:50

标签: android firebase firebase-realtime-database

我正在使用Firebase数据库在android聊天应用程序上工作,我不知道代码出了什么问题,因为user1第一次发送消息时,它对于user1和当user2第一次发送消息时,也会发生同样的情况。 我指的是这样的:

image1

image2

这是从firebase数据库获取消息的代码。

usersRef.addChildEventListener(new ChildEventListener() {
            @Override
            public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                ms = dataSnapshot.child("rec_msg").getValue(String.class);
                fUid = dataSnapshot.child("fromUID").getValue(String.class);

                if(ms!=null && !ms.equals(""))
                    addMessageBox(ms);

            }

            @Override
            public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
                ms = dataSnapshot.child("rec_msg").getValue(String.class);
                fUid = dataSnapshot.child("fromUID").getValue(String.class);

                if(ms!=null && !ms.equals(""))
                    addMessageBox(ms);

            }

            @Override
            public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

            }

            @Override
            public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

            }

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

            }
        });

“ addMessageBox(String msg)”的代码如下:

private void addMessageBox(String message){

           TextView tv = new TextView(Main5Activity.this);
           tv.setText(message);
           tv.setPadding(20, 30, 30, 20);
           tv.setTextSize(1, (float) 20.1);

           LinearLayout.LayoutParams lp2 = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
           lp2.weight = 1.0f;



           if (mAuth.getCurrentUser().getUid().equals(fUid)) {

               lp2.gravity = Gravity.END;
               tv.setBackgroundResource(R.drawable.rounded_rectangle_grey);

           }
           else if(mAuth.getCurrentUser().getUid().equals(toUid)){

               lp2.gravity = Gravity.START;
               tv.setBackgroundResource(R.drawable.rounded_rectangle_violet);

           }

           tv.setLayoutParams(lp2);
           layout.addView(tv);
           scrollView.fullScroll(ScrollView.FOCUS_DOWN);


    }
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
        final DatabaseReference usersRef = rootRef.child("users");

1 个答案:

答案 0 :(得分:0)

这是因为要在OnChildChanged和OnChildAdded上添加一条消息。第一次发送消息时,两种方法都被调用,导致同一条消息被添加两次。尝试仅在OnChildAdded方法中保持逻辑。

usersRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
            ms = dataSnapshot.child("rec_msg").getValue(String.class);
            fUid = dataSnapshot.child("fromUID").getValue(String.class);

            if(ms!=null && !ms.equals(""))
                addMessageBox(ms);

        }

        @Override
        public void onChildChanged(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {
        }

        @Override
        public void onChildRemoved(@NonNull DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(@NonNull DataSnapshot dataSnapshot, @Nullable String s) {

        }

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

        }
    });