如何从onDataChange函数设置全局变量

时间:2017-10-22 20:16:21

标签: java android firebase

我在我的项目中使用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

        }

如何将变量保存在当前函数中,而不是再次重置为默认值?

希望你能帮忙!

1 个答案:

答案 0 :(得分:1)

firebase侦听器内部的代码是一个回调函数,它将在未来的某个时刻调用,但是在发生这种情况时不会指定它。

所以会发生什么:

  1. 您致电ref2.addListenerForSingleValueEvent(..)
  2. 执行Log.d("ID YYYYYYYY" , gameIDperm);,此时变量尚未更改。
  3. Firebase稍后会调用onDataChange(..),更改变量。
  4. 执行Log.d("ID XXXX" , gameIDperm);
  5. 在这种异步执行中,您不能依赖代码的顺序来告诉您何时执行。

    此外,您正在使用变量gameIDperm来查找firebase引用的子项,然后使用内容重写该变量。这可能不正确。