Firebase Realtime Database删除消息出现endAllActiveAnimators报错求助
问题原因
首先你看到的D/OpenGLRenderer: endAllActiveAnimators属于系统输出的Debug级日志,并不是业务运行报错,和Firebase Realtime Database的删除逻辑没有直接关联,触发原因如下:
- 该日志是你点击删除弹出AlertDialog确认后,弹窗关闭时系统自动回收弹窗内列表控件未完成动画时输出的常规渲染层日志,不会引发任何功能异常。
- 你感知到删除功能异常的真实原因来自两处逻辑错误:
- 操作流程顺序错误:你先执行了本地列表的元素移除,再去调用
userMessagesList.get(position)获取要删除的消息参数,此时对应位置的元素已经被移除,会拿到无效数据甚至触发索引越界,导致传入Firebase的删除参数错误。 - 数据库删除路径冗余错误:你的删除路径已经定位到
messageID节点后,又额外拼接了to、from、messageID三层子节点,和实际存储消息的路径不匹配,导致找不到要删除的目标数据。
- 操作流程顺序错误:你先执行了本地列表的元素移除,再去调用
解决方案
- 调整删除操作的执行顺序,先获取待删除的消息对象,等Firebase删除成功后再更新本地列表和UI,同时修正数据库删除路径(可根据你实际的消息存储结构调整路径):
private void deleteReceiverMessage(final int position, final MessageViewHolder holder) { // 提前获取待删除的消息对象,避免后续索引失效 Message targetMessage = userMessagesList.get(position); // 修正冗余的删除路径,确保和消息存储路径一致 usersRef.child(messageReceiverId).child(messageSenderId) .child("Messages") .child(targetMessage.getMessageID()) .removeValue().addOnCompleteListener(new OnCompleteListener<Void>() { @Override public void onComplete(@NonNull Task<Void> task) { if (task.isSuccessful()) { // 云端删除成功后再更新本地列表 userMessagesList.remove(position); notifyItemRemoved(position); } else { // 可增加失败提示排查问题 Toast.makeText(context, "删除失败:" + task.getException().getMessage(), Toast.LENGTH_SHORT).show(); } } }); }
- 该OpenGL相关日志属于系统正常日志,不需要做代码层面的修复,如果你不想在Logcat中看到它,配置Logcat过滤规则排除
OpenGLRenderer标签的Debug级日志即可。
内容的提问来源于stack exchange,提问作者ZaPolarBear
相关产品推荐
相关产品推荐

