作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在我的项目中使用 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
}
如何使变量保存在当前函数中并且不会再次重置为默认值?
希望能帮到你!
最佳答案
Firebase 监听器内部的代码是一个回调,它将在将来的某个时刻被调用,但没有指定何时发生。
所以发生的事情是:
ref2.addListenerForSingleValueEvent(..)
Log.d("ID YYYYYYYY", gameIDperm);
,此时变量还没有改变。onDataChange(..)
,更改变量。Log.d("ID XXXX", gameIDperm);
在这样的异步执行中,您不能依赖代码的顺序来告诉您何时执行。
此外,您还使用变量 gameIDperm
来查找 firebase 引用的子级,然后用内容重写该变量。这可能不正确。
关于java - 如何从 onDataChange 函数设置全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46878738/
我是一名优秀的程序员,十分优秀!