更改内部 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 完成,然后打印消息。