我在读取Firebase的价值时遇到一些问题,运行项目时收入和支出没有变化,好像它没有在Firebase上获得价值,但我不知道为什么?

private void getMoney()
{
    myRef.child("money").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
                if (dataSnapshot.child("income").exists()) {
                    income = Integer.parseInt(dataSnapshot.child("income").getValue().toString());
                }
                if (dataSnapshot.child("expense").exists()) {
                    expense = Integer.parseInt(dataSnapshot.child("expense").getValue().toString());
                }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    money = income - expense;
}

@Override
protected void onCreate(Bundle savedInstanceState) {

    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    txtTong= (TextView) findViewById(R.id.txtTong);
    getMoney();
    txtTong.setText("Money: " + money);
    initView();

最佳答案

首先,在您的(getMoney())的onDatachange方法中,更改此部分:

            if (dataSnapshot.child("income").exists()) {
                income = Integer.parseInt(dataSnapshot.child("income").getValue().toString());
            }
            if (dataSnapshot.child("expense").exists()) {
                expense = Integer.parseInt(dataSnapshot.child("expense").getValue().toString());
            }


对此

            if (dataSnapshot.child("income").exists()) {
                income = dataSnapshot.child("income").getValue(Integer.class);
            }
            if (dataSnapshot.child("expense").exists()) {
                expense = dataSnapshot.child("expense").getValue(Integer.class);
            }


并更改其位置:

        money = income - expense;


并将其放在onDatachange的末尾,在这些下面:

               if (dataSnapshot.child("income").exists()) {
            income = dataSnapshot.child("income").getValue(Integer.class);
        }
               if (dataSnapshot.child("expense").exists()) {
            expense = dataSnapshot.child("expense").getValue(Integer.class);
        }

        //here you add it
        money = income - expense;


编辑

看起来值被很好地检索了,唯一的问题是在textview中显示值。

当在onDatachange()之外设置setTEXT()时,文本视图不知道(money)的值是什么,因为只有将货币放在onDatachange中时,货币才具有正确的值。

因此,所有与金钱有关的事物都应包含在onDatachange中

所以你这样做:

       myRef.child("money").addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
            if (dataSnapshot.child("income").exists()) {
                income = dataSnapshot.child("income").getValue(Integer.class);
            }
            if (dataSnapshot.child("expense").exists()) {
                expense = dataSnapshot.child("expense").getValue(Integer.class);
            }

       //here you set money
       money = income - expense;

       //and also here you set the text

       txtTong.setText("Money: " + money);
    }

    @Override
    public void onCancelled(DatabaseError databaseError) {

    }
});


发生这种情况是因为不能保证在设置textview中的money值之前调用onDatachange

关于java - 无法在Android的Firebase上获得值(value),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47572184/

10-10 11:38