我正在使用Android Studio创建应用并使用Firebase模拟后端数据库。目前,我正在尝试启用该应用以接收并显示我通过Firebase输入的数据。当我使用Firebase数据快照方法捕获数据时,由于快照发生在内部类中,我无法保存和使用数据。
例如,在Firebase中,我已将“Fri”的值指定为“2步”。如果查看下面的代码,第一个print语句(在内部类中)打印“Friday Steps:2 steps”,但第二个print语句(在内部类之外)打印“Friday Steps:null”。这是一个问题,因为我需要能够使用正确的fridaySteps值(以及其他工作日的String变量),在以后的assign语句中为mDataset赋值。
public class MainActivity extends AppCompatActivity {
private String[] mDataset = new String[7];
String fridaySteps;
String thursdaySteps;
String wednesdaySteps;
String tuesdaySteps;
String mondaySteps;
@Override
protected void onCreate(Bundle savedInstanceState) {
mDataset[0]= "";
mDataset[1]= "";
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Firebase.setAndroidContext(this);
Firebase ref = new Firebase(Config.FIREBASE_URL);
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
fridaySteps = snapshot.child("Fri").getValue(String.class);
thursdaySteps = snapshot.child("Thu").getValue(String.class);
wednesdaySteps = snapshot.child("Wed").getValue(String.class);
tuesdaySteps = snapshot.child("Tue").getValue(String.class);
mondaySteps = snapshot.child("Mon").getValue(String.class);
System.out.println("Friday Steps: "+fridaySteps);
}
@Override public void onCancelled(FirebaseError error) { }
});
System.out.println("Friday Steps: "+fridaySteps);
mDataset[2] = ("Fri "+fridaySteps);
mDataset[3] = ("Thu "+thursdaySteps);
mDataset[4] = ("Wed "+wednesdaySteps);
mDataset[5] = ("Tue "+tuesdaySteps);
mDataset[6] = ("Mon "+mondaySteps);
}
}
有没有人就如何解决这个问题提出建议?谢谢!
答案 0 :(得分:1)
由于检索Firebase数据是异步的,因此您无法立即访问它。
将您的值分配到mDataset
内的onDataChange
以供日后使用。像这样:
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot snapshot) {
fridaySteps = snapshot.child("Fri").getValue(String.class);
thursdaySteps = snapshot.child("Thu").getValue(String.class);
wednesdaySteps = snapshot.child("Wed").getValue(String.class);
tuesdaySteps = snapshot.child("Tue").getValue(String.class);
mondaySteps = snapshot.child("Mon").getValue(String.class);
mDataset[2] = ("Fri "+fridaySteps);
mDataset[3] = ("Thu "+thursdaySteps);
mDataset[4] = ("Wed "+wednesdaySteps);
mDataset[5] = ("Tue "+tuesdaySteps);
mDataset[6] = ("Mon "+mondaySteps);
printData();
}
@Override public void onCancelled(FirebaseError error) { }
});
...
private void printData() {
System.out.println("Friday Steps: "+fridaySteps);
}
答案 1 :(得分:0)
这是因为addValueEventListener是异步的,当执行addValueEventListener时,下一步是打印第二个System.out.println(“Friday Steps:”+ fridaySteps),因此它返回null,它不会等待addValueEventListener完成了。 另一方面,第一个System.out.println(“Friday Steps:”+ fridaySteps)将等待addValueEventListener完成,然后它将打印消息。