当前位置: 首页 > 知识库问答 >
问题:

更改内部类中变量的值

王长卿
2023-03-14

我正在使用Android Studio创建一个应用程序,并使用Firebase模拟后端数据库。目前,我正在尝试使应用程序能够接收并显示我通过Firebase输入的数据。当我使用Firebase data snapshot方法捕获数据时,由于快照发生在内部类中,我无法保存和使用数据。

例如,在Firebase中,我已将“Fri”的值指定给“2步”。如果您查看下面的代码,第一条print语句(内部类内)打印“Friday Steps:2 Steps”,而第二条print语句(内部类外)打印“Friday Steps:null”。这是一个问题,因为我需要能够在以后将值分配给mDataset的assign语句中使用fridaySteps的正确值(以及其他工作日的字符串变量)。

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个答案

姬选
2023-03-14

这是因为addValueEventListener是异步的,当addValueEventListener被执行时,下一步是打印第二个系统。出来println(“Friday Steps:”Friday Steps),由于这个原因,它将返回null,它不会等待addValueEventListener完成。另一方面,第一个系统。出来println(“星期五步骤:“星期五步骤”)将等待addValueEventListener完成,然后打印消息。

陶胤运
2023-03-14

由于检索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);
}
 类似资料:
  • 我正在研究一个涉及for循环和if-else语句的java函数。我需要根据多次迭代中的条件更改标志变量的值。我声明了一个名为flag的变量,并希望根据每次迭代中的条件进行更改。我需要在每次迭代结束时打印flag变量的值。但是当我打印变量时,它显示了一个错误,变量没有初始化。如果我给它一个初始值,它会一直打印初始值,而不是在If-else语句中处理的值。我不能根据自己的要求初始化for循环中的fla

  • 问题内容: 在内部类中,可以访问外部类的变量,但不能访问方法的局部变量。我了解了无法访问方法的局部变量的部分,但我想知道为什么外部类变量可以访问? 我的理解是,由于内部类与外部类绑定,因此只要父级可用,子级就可以访问其父级变量。我对么? 问题答案: 假设您的外部类在内部类的范围内(非静态)被称为,以获取该字段。 例如, 其中Outer是类的名称,并标识该字段。 您也可以直接抓取它,但是如果由于阴影

  • 在内部类中,外部类的变量是可访问的,但方法的局部变量不是。我理解了关于方法的局部变量不可访问的部分,但我想知道为什么外部类变量是可访问的? 我的理解是,由于内部类与外部类绑定,因此只要父类可用,子类就可以访问其父变量。我说得对吗?

  • 问题内容: 为什么我需要声明一个方法,好像我在方法中定义的需要使用它一样? 范例: } 为什么String 需要是最终常量?它如何影响? 问题答案: 答案是两者在不同的范围内。因此该变量可以在内部类访问它之前更改。将其最终确定可以防止这种情况。