我正在尝试获取一个值,然后将该值增加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) {
}
});
答案 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 以获得更好的理解。