上一个活动的方法在onBackPress上再次被调用

时间:2018-06-22 13:26:34

标签: java android firebase firebase-realtime-database

屏幕截图1-https://ibb.co/k5O8Eo

屏幕截图2-https://ibb.co/bz5MZo

第一个截屏是它的行为方式,当我打开它时,它的行为类似……但是当我打开该活动并转到下一个活动并返回时...再次获取相同的消息,然后显示两次,尽管仅在数据库中显示一次...如何解决此问题?

    @Override
protected void onStart() {
    super.onStart();
    fetchMessages();
}

private void fetchMessages() {
   mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            Messages message = dataSnapshot.getValue(Messages.class);
            messagesList.add(message);
            mAdapter.notifyDataSetChanged();
        }
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
        }
        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {
        }
        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }
        @Override
        public void onCancelled(DatabaseError databaseError) {
            throw databaseError.toException();
        }
    });
}

3 个答案:

答案 0 :(得分:0)

之所以发生这种情况,是因为您正在从fetchMessages()方法内部调用onStart()方法,这意味着您每次停止然后再开始活动,都会触发此方法,并且最终导致重复数据。

要解决此问题,请在onCreate()方法中移动该方法的调用,这样即使从另一个活动返回或调用了onBackPress()方法,您也只能显示一次数据

答案 1 :(得分:0)

之所以可能发生,是因为您的活动在堆栈中,并且每次您返回onStart方法都会导致多次提取。

您可以清除onStop()

中的列表
 @Override
 public void onStop(){
 if(messagesList != null){
   messageList.clear();
}
}

答案 2 :(得分:0)

每次您的活动开始时,您都会呼叫onStart,从而在Firebase中添加一个侦听器。这意味着第二次启动活动时,您最终要添加第二个侦听器。因此,届时您将两次从Firebase接收数据。

解决方案是使用相应的生命周期方法删除侦听器。由于您在onStop中添加了侦听器,因此应在public void onStop() { super.onStop(); mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).removeChildEvenListener(mListener); } 中将其删除:

mListener

您会注意到这里需要一个onStart,因此您需要在mListener = mDatabaseReference.child("Messages").child(MessageSenderId).child(MessageRecieverId).addChildEventListener(new ChildEventListener() { ... 中捕获它:

poppler Qt5