我在firebase
上有一个数据库,我想要检索一些数据并使用shared preferences
将其保存到我的应用中。当我尝试从activtiy
获取另一个shared preferences
中的值时,我在保存之前保存了。但是吐司会弹出正确的值。
我从onCreate()
调用getLocDbs()。
我尝试了async task
,但在Firebase
本身就是异步之后我就读了。
为什么我会变空?
由于
public void getLocDbs() {
firebaseRef.child("rpi_lox").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
Toast.makeText(Welcomer.this, singleSnapshot.getValue
(postObject.class).result, Toast.LENGTH_SHORT).show();
allLox += singleSnapshot.getValue
(rpiLocTemplate.class).locName+ ";";
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
PreferenceManager.getDefaultSharedPreferences(Welcomer.this)
.edit()
.putString("ls_locations", allLox).apply();
}
答案 0 :(得分:1)
你需要移动
PreferenceManager.getDefaultSharedPreferences(Welcomer.this)
.edit()
.putString("ls_locations", allLox).apply();
在onDataChange
内,因为网络调用将需要一些时间才能完成,并且在收到响应时将调用onDataChange
,否则您将优先保存为空并且稍后会收到数据
public void getLocDbs() {
firebaseRef.child("rpi_lox").addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot singleSnapshot : dataSnapshot.getChildren()) {
Toast.makeText(Welcomer.this, singleSnapshot.getValue
(postObject.class).result, Toast.LENGTH_SHORT).show();
allLox += singleSnapshot.getValue
(rpiLocTemplate.class).locName+ ";";
}
PreferenceManager.getDefaultSharedPreferences(Welcomer.this)
.edit()
.putString("ls_locations", allLox).apply();
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
Do you have any idea, why my string begins with null?
你已将字符串声明为String allLox;
,它将指定空值,当你执行+=
时,它将在第一次迭代中追加为空
`allLox = allLox + otherstuff`
// allLox = null + otherstuff
所以将你的字符串变量声明为
String allLox = "";
或者您可以在使用StringBuilder
方法时使用append
来实现效率