更改内部类

时间:2016-06-16 14:45:28

标签: java android firebase-realtime-database

我正在使用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);

    }
}

有没有人就如何解决这个问题提出建议?谢谢!

2 个答案:

答案 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完成,然后它将打印消息。