【问题标题】:infinite loop in onDataChange(DataSnapshot dataSnapshot) fn in firebaseFirebase中onDataChange(DataSnapshot dataSnapshot)fn中的无限循环
【发布时间】:2018-01-02 09:02:40
【问题描述】:

我有一个类似这样的代码:

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).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if(genre_status_selected!="" && genreitem_status_selected!="" && 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!="" && genreitem_status_selected!="" && 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) {

                    }
                });
            }
        });

每当我单击更改状态按钮时,它都会更改状态,但是由于它位于 onDataChange 中,因此会导致无限循环...无限次更改其状态...如何摆脱这种情况?如何摆脱这个循环?我只想改变它的状态一次。

【问题讨论】:

  • 我能想到的唯一解决方案是创建一个ValueEventListener 类型的全局变量。然后你可以设置它,当发生变化时,你可以删除监听器,改变你已经在做的值,然后重新设置监听器。顺便说一句,您以错误的方式比较字符串;您应该使用equals 来比较字符串对象
  • 使用 addListenerForSingleValueEvent 代替 ValueEventListener。为什么你在 onclick 监听器中使用 ValueEventListener ?

标签: android firebase firebase-realtime-database infinite-loop


【解决方案1】:

改变

addValueEventListener

到这里

addListenerForSingleValueEvent

mfirebasedatabase.getReference().child("genre_items").child(genre_status_selected).child(genreitem_status_selected).addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        if(genre_status_selected!="" && genreitem_status_selected!="" && 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!="" && genreitem_status_selected!="" && 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) {

                    }
                });

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-12-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-12
    相关资源
    最近更新 更多