屏幕截图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();
}
});
}
答案 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