从Override onDataChange保存字符串以在Android Firebase中查看外部
我从数据库中得到了一个字符串变量。我在@Override onDataChange方法中有一个访问权限 但是我想在@Override方法之外看到这个字符串的值。现在,我看不到,因为数据库中这个字符串的值只有在@Override方法中才可用从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
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。