更改内部 class 中变量的值
Changing the value of a variable inside an inner class
我正在使用 Android Studio 创建应用程序并使用 Firebase 模拟后端数据库。目前,我正在尝试让该应用程序接收并显示我通过 Firebase 输入的数据。当我使用 Firebase 数据快照方法捕获数据时,由于快照发生在内部 class 中,我无法保存和使用数据。
例如,在 Firebase 中,我已将 "Fri" 的值分配给“2 步”。如果您查看下面的代码,第一个打印语句(内部 class 内部)打印 "Friday Steps: 2 steps",但第二个打印语句(内部 class 外部)打印 "Friday Steps: null" .这是一个问题,因为我需要能够在稍后为 mDataset 赋值的 assign 语句中使用 fridaySteps 的正确值(以及其他工作日的 String 变量)。
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);
}
}
有人对我如何解决这个问题有建议吗?谢谢!
由于检索 Firebase 数据是异步的,因此您无法立即访问它。
将您的值分配给 onDataChange
内部的 mDataset
以备后用。像这样:
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);
}
这是因为addValueEventListener是异步的,当addValueEventListener被执行时,下一步是打印第二个System.out.println("Friday Steps: "+fridaySteps),因此它返回null,它不等待 addValueEventListener 完成。
另一方面,第一个 System.out.println("Friday Steps: "+fridaySteps) 将等待 addValueEventListener 完成,然后打印消息。
我正在使用 Android Studio 创建应用程序并使用 Firebase 模拟后端数据库。目前,我正在尝试让该应用程序接收并显示我通过 Firebase 输入的数据。当我使用 Firebase 数据快照方法捕获数据时,由于快照发生在内部 class 中,我无法保存和使用数据。
例如,在 Firebase 中,我已将 "Fri" 的值分配给“2 步”。如果您查看下面的代码,第一个打印语句(内部 class 内部)打印 "Friday Steps: 2 steps",但第二个打印语句(内部 class 外部)打印 "Friday Steps: null" .这是一个问题,因为我需要能够在稍后为 mDataset 赋值的 assign 语句中使用 fridaySteps 的正确值(以及其他工作日的 String 变量)。
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);
}
}
有人对我如何解决这个问题有建议吗?谢谢!
由于检索 Firebase 数据是异步的,因此您无法立即访问它。
将您的值分配给 onDataChange
内部的 mDataset
以备后用。像这样:
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);
}
这是因为addValueEventListener是异步的,当addValueEventListener被执行时,下一步是打印第二个System.out.println("Friday Steps: "+fridaySteps),因此它返回null,它不等待 addValueEventListener 完成。 另一方面,第一个 System.out.println("Friday Steps: "+fridaySteps) 将等待 addValueEventListener 完成,然后打印消息。