Android:Firebase数字增量

Mic*_*ael 4 java android firebase firebase-realtime-database

我坚持使用Firebase在Java中增加一个值,但事实是它不会更新全局变量。当我在onStart上调用EventListener时,它会成功向我显示变量的正确值(60)。当我想将其增加10(单击按钮)时,它将显示0。

long value;

@Override
protected void onStart() {
    super.onStart();

    final TextView mValue = (TextView) findViewById(R.id.some_textview);

    mRef = new Firebase(some_correct_url);
    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value = (long) dataSnapshot.getValue();
            mValue.setText(value+"");
        }

        @Override
        public void onCancelled(FirebaseError firebaseError) {

        }
    });
}
Run Code Online (Sandbox Code Playgroud)

当单击按钮时,将调用以下功能

public void addTen(View view) {
    mRef = new Firebase(my_private_url);
    mRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value =(long) dataSnapshot.getValue();
            value = value + 10;
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });

    mRef.setValue(value);

}
Run Code Online (Sandbox Code Playgroud)

因此,总的来说,第一部分检索变量的正确值,但是第二部分没有增加正确值。提前致谢!

编辑:顺便说一下,我将Firebase规则设置如下:

{
"rules": {
".read": "true",
".write": "true"
}
}
Run Code Online (Sandbox Code Playgroud)

这是为了开发时间。

Bob*_*der 6

Firebase侦听器异步触发。您的调用将mRef.setValue(value)在激发和更新监听器之前执行value。像这样更改代码:

public void addTen(View view) {
    mRef = new Firebase(my_private_url);
    mRef.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            value =(long) dataSnapshot.getValue();
            value = value + 10;
            dataSnapshot.getRef().setValue(value);
        }
        @Override
        public void onCancelled(FirebaseError firebaseError) {
        }
    });
}
Run Code Online (Sandbox Code Playgroud)

注意已addListenerForSingleValueEvent()替换addValueEventListener()。我认为您不希望每次addten()调用时都将监听器堆积起来。