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

标签 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

        }

如何使变量保存在当前函数中并且不会再次重置为默认值?

希望能帮到你!

最佳答案

Firebase 监听器内部的代码是一个回调,它将在将来的某个时刻被调用,但没有指定何时发生。

所以发生的事情是:

  1. 您调用ref2.addListenerForSingleValueEvent(..)
  2. 你执行Log.d("ID YYYYYYYY", gameIDperm);,此时变量还没有改变。
  3. Firebase 稍后调用 onDataChange(..),更改变量。
  4. 您执行Log.d("ID XXXX", gameIDperm);

在这样的异步执行中,您不能依赖代码的顺序来告诉您何时执行。

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

关于java - 如何从 onDataChange 函数设置全局变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46878738/

相关文章:

java - 如何使用@ContextConfiguration配置另一个项目的值

java - 如何使用 docx4java 读取 msword docx 中的所有合并字段?

android - 在jni文件夹android中生成文件的最简单方法

javascript - 仅调用众多 Firebase 函数之一

swift firebase 保持用户登录

java - 嵌套 Vaadin 应用程序

java - 对构造函数的 ArrayList 属性进行标记

android - zza.zza FirebaseAuthFallbackService 泄漏

java - 调度或重定向到其他 Activity 的 Activity

Android 在循环中引用自定义 View ?