我是数据库中的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"
}
答案 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毫秒才能运行