我在我的项目中使用firebase,我试图找出如何解决下一个问题几个小时已经没有成功, 我有下一个代码:
// gameIDperm is set as 0 as default
public void GenerateID(){
ref2.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
if(snapshot.hasChild(gameIDperm))
{
gameIDperm = Integer.toString(Integer.parseInt(gameIDperm)+1);
Log.d("ID XXXX" , gameIDperm); // Here it says the right number
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Log.d("ID YYYYYYYY" , gameIDperm); // Here it says gameIDperm is 0 again
}
如何将变量保存在当前函数中,而不是再次重置为默认值?
希望你能帮忙!
答案 0 :(得分:1)
firebase侦听器内部的代码是一个回调函数,它将在未来的某个时刻调用,但是在发生这种情况时不会指定它。
所以会发生什么:
ref2.addListenerForSingleValueEvent(..)
Log.d("ID YYYYYYYY" , gameIDperm);
,此时变量尚未更改。onDataChange(..)
,更改变量。Log.d("ID XXXX" , gameIDperm);
在这种异步执行中,您不能依赖代码的顺序来告诉您何时执行。
此外,您正在使用变量gameIDperm
来查找firebase引用的子项,然后使用内容重写该变量。这可能不正确。