从Override onDataChange保存字符串以在Android Firebase中查看外部

从Override onDataChange保存字符串以在Android Firebase中查看外部,android,firebase,firebase-realtime-database,Android,Firebase,Firebase Realtime Database,我从数据库中得到了一个字符串变量。我在@Override onDataChange方法中有一个访问权限 但是我想在@Override方法之外看到这个字符串的值。现在,我看不到,因为数据库中这个字符串的值只有在@Override方法中才可用 firebase.addValueEventListener(new ValueEventListener() { @Override public void onDataChange(D

我从数据库中得到了一个字符串变量。我在@Override onDataChange方法中有一个访问权限

但是我想在@Override方法之外看到这个字符串的值。现在,我看不到,因为数据库中这个字符串的值只有在@Override方法中才可用

    firebase.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {

                    CarClass carClass = dataSnapshot.getValue(CarClass.class);

                    string1 = carClass.getCarName();
                    // value of "string1" is = "name"

                }

                @Override
                public void onCancelled(FirebaseError firebaseError) {

                }
            });
// here value of "string1" is empty.
有人能帮我解决这个问题吗

编辑:

我自己找到了解决办法:

为了从“onDataChange方法”访问值“string1”,我使用了SharedReferences。我将这个“string1”放在@Override方法中的SharedReferences中,我可以使用SharedReferences在这个方法之外获得这个“string1”值

我的解释如下:

     public static final String Car_Name = "Name_PREFS";
     public static final String Car_Key = "String_PREFS";
     SharedPreferences sharedPreferences;

      firebase.addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(DataSnapshot dataSnapshot) {

                            CarClass carClass = dataSnapshot.getValue(CarClass.class);

                            string1 = carClass.getCarName();


    sharedPreferences = getApplicationContext().getSharedPreferences(Car_Name, Context.MODE_PRIVATE);
       SharedPreferences.Editor editor = sharedPreferences.edit();
                    editor.putString(Car_Key, string1);
                    editor.apply();


                        }

                        @Override
                        public void onCancelled(FirebaseError firebaseError) {

                        }
                    });


    sharedPreferences = getApplicationContext().getSharedPreferences(Car_Name, MODE_PRIVATE);
            string1 = sharedPreferences.getString(Car_Key, null);
            // here value of "string1" exists outside of "onDataChange" method.
// string1 = "name"
    }

让我从这里复制我的答案:(注意问题不完全相同,但答案相似)

让我更简单地描述一下您的代码如何无法按预期工作:

    firebase.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            ... (point 1)
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {}
    });

    ... (point 2)
Firebase数据库异步加载数据。这意味着(简单地说)获取数据的过程不会干扰您的主过程。记住这一点,
(第2点)
中的代码并不总是在
(第1点)
中的代码之后执行,反之亦然。虽然通常
(第1点)
中的代码在
(第2点)
之后执行,但并不总是这样。因此,你应该考虑你在<代码>(点1)中编写的代码可以在任何时候执行。 然后你应该用这个概念来编写你的代码。这意味着,如果您想对
(第1点)
中的变量执行任何操作(如获取
string1
的值),则应将其全部放在
(第1点)

希望这有帮助


注意:在注释(来自链接问题)中提到,
(第2点)
总是在
(第1点)
之后执行,因为回调
onDataChange
至少需要4毫秒才能运行

我使用SharedReferences解决了这个问题。目前,只有这个解决方案可以在@Override方法之外使用string1。你上面的解决方案并不能真正解决你的问题。请参阅,
SharedReference
不会在应用程序关闭时清除。这意味着您的解决方案只是使用上次打开应用程序时的
string1
数据。请尝试清除数据或重新安装应用程序,使其第一次运行,并告诉我是否工作正常:)是的,你是对的。。当应用程序第一次关闭并再次打开时,它将使用上一次使用的string1。当我再次打开“活动”时,它会正确显示值。那么,我如何解决这个挑战呢?我试过你的解决方案,但我也不能工作。你有什么想法吗?我认为我的解决方案更好。你为什么不试试呢?那么您想对
string1
做什么呢?这是复杂的算法吗?或者它与视图/布局相关?此string1是firebase数据库中图像的URL地址。我在OnCreate方法中与毕加索一起使用它,但在@Override onDataChange之外。我想使用它作为您的解决方案,但它无法与毕加索和上下文一起使用此函数。我创建了一个外部函数,从firebase获取数据并在OnCreate中调用它,接下来我调用Picasso方法,它使用SharedRef中的string1。