Firebase onDataChange方法增加值

时间:2018-08-01 13:13:58

标签: android firebase-realtime-database

我正在尝试获取一个值,然后将该值增加1。问题是我无法从onDataChange方法中获取此值,如果我在该方法内执行该工作,则会得到循环并将其不断地添加到该值中。我该怎么办?

这是我的代码:

rootRef.child("users").addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    int rat = Integer.parseInt(dataSnapshot.child(current_user).child("rating").getValue().toString());

                    System.out.println(rat);

                    rat = rat + 1;

                    rootRef.child("users").child(current_user).child("rating").setValue(rat);

                    System.out.println(rat);
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {

                }
            });

2 个答案:

答案 0 :(得分:2)

如果您需要一次从firebase db接收数据,则需要使用addListenerForSingleValueEvent(...)而不是 addValueEventListener(...)。然后onDataChange()将只返回一次。

addValueEventListener每次有任何值更新时都会调用。

在上述情况下,每次增加值并再次更新节点时,addValueEventListener都会重复调用,因此其行为就像无限循环。

答案 1 :(得分:1)

Firebase API是asynchronous,这意味着您正在谈论的onDataChange()方法在调用后立即返回,并且从返回的Task返回的回调将在一段时间后被调用。无法保证需要多长时间,可能需要几百毫秒到几秒钟才能获得该数据。由于该方法会立即返回,因此您尚未尝试从rat方法之外使用它的onDataChange()变量的值。

基本上,您尝试从异步的API同步返回rat的值。那不是一个好主意。您应该按预期异步处理API。

对此问题的快速解决方案是仅在rat方法内使用值onDataChange(),否则我建议您从此 {{3} } ,其中我解释了如何使用自定义回调来完成。您也可以查看此 post 以获得更好的理解。