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

时间:2017-01-08 01:15:03

标签: android firebase firebase-realtime-database

我是数据库中的String变量。我在@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”的值,我使用了SharedPreferences。我把这个“string1”放在@Override方法的SharedPreferences中,我可以使用SharedPreferences在此方法之外获取“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"
    }

1 个答案:

答案 0 :(得分:0)

让我在this question复制我的答案:(注意问题不完全相同,但答案相似)

让我通过描述您的代码如何不按预期工作来使其变得更简单:

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

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

    ... (point 2)

Firebase数据库异步加载您的数据。这意味着(简单地说)获取数据的过程不会干扰您的主要过程。考虑到这一点,(point 2)中的代码并不总是在(point 1)中的代码之后执行,反之亦然。虽然(point 1)中的代码通常会在(point 2)之后执行,但并不总是如此。因此,您应该考虑在(point 1)中编写的代码可以随时执行。

然后你应该用这个概念编写你的代码。这意味着如果你想对(point 1)内的变量做任何事情(比如获取string1的值),你应该将它全部放在(point 1)

希望得到这个帮助。

注意:JP Ventura在评论中提及(来自链接问题)(point 2)始终在(point 1)之后执行,因为回调onDataChange将至少需要4毫秒才能运行