Firebase中onDataChange触发无限循环问题求助
解决Firebase数据修改触发无限循环的问题
这个问题我太熟悉了!你遇到的无限循环根源在于使用了addValueEventListener——这个方法会持续监听目标节点的数据变化:每次你修改状态后,数据库里的值发生改变,它就会再次触发onDataChange回调,然后又执行一遍修改逻辑,最终陷入反复切换状态的死循环。
解决方案:改用一次性数据监听
把addValueEventListener替换成addListenerForSingleValueEvent就可以解决问题。这个方法只会读取一次当前节点的数据,执行完回调逻辑后就自动移除监听,不会再响应后续的数据变化,完美避免循环触发。
修改后的代码如下:
change_status_button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { mfirebasedatabase.getReference().child("genre_items").child(genre_status_selected).child(genreitem_status_selected) .addListenerForSingleValueEvent(new ValueEventListener() { // 替换为一次性监听 @Override public void onDataChange(DataSnapshot dataSnapshot) { // 小提示:Java里判断空字符串建议用isEmpty(),避免引用比较的问题 if(genre_status_selected != null && !genre_status_selected.isEmpty() && genreitem_status_selected != null && !genreitem_status_selected.isEmpty() && dataSnapshot.child("status").getValue().equals("available")) { mfirebasedatabase.getReference().child("genre_items").child(genre_status_selected).child(genreitem_status_selected).child("status").setValue("unavailable"); } else if(genre_status_selected != null && !genre_status_selected.isEmpty() && genreitem_status_selected != null && !genreitem_status_selected.isEmpty() && dataSnapshot.child("status").getValue().equals("unavailable")) { mfirebasedatabase.getReference().child("genre_items").child(genre_status_selected).child(genreitem_status_selected).child("status").setValue("available"); } } @Override public void onCancelled(DatabaseError databaseError) { // 建议添加错误处理,方便排查问题 databaseError.toException().printStackTrace(); } }); } });
额外说明
addListenerForSingleValueEvent适合这种“读取一次数据后执行修改”的场景,它不会长期占用监听资源,也不会触发重复回调。- 另外注意原来的空字符串判断
genre_status_selected!=""在Java中存在风险,字符串引用比较可能不符合预期,换成!= null && !isEmpty()的组合判断更安全。
内容的提问来源于stack exchange,提问作者Sparsh Wadhwa
相关产品推荐
相关产品推荐

