Firebase值事件侦听器无法正常工作

App*_*fly 5 android firebase firebase-realtime-database

在我的应用程序中,我有一个id应该从firebase实时数据库中下载.如果我把它拉下来并且它看到没有可用的id,那么它将id设置为1.我做了一个调试,并且id设置为1,但是在监听器完成之后,id变为0.不知道为什么或导致这种情况的原因,但这是我的代码.

听众代码:

userRef.child("id").

addSingleValueEventListener(new ValueEventListener() {
    @Override public void onDataChange (DataSnapshot dataSnapshot){
        try {
            String value = dataSnapshot.getValue().toString();
            id = Integer.parseInt(value);
        } catch (NullPointerException e) {
            id = 1;  //After this, id is 1
            e.printStackTrace();
        }
    }

    @Override public void onCancelled (DatabaseError databaseError){
        id = 1;
    }
}); //Now id is 0
Run Code Online (Sandbox Code Playgroud)

Lew*_*ary 6

从这个问题中可以想到两件事,一个关于Firebase监听器,第二个关于删除多余的代码.

Firebase监听器的一个基本要素是它们是异步的,这意味着您的代码在执行下一行之前不会等待结果.请查看此框架代码中的注释:

userRef.child("id").
addSingleValueEventListener(new ValueEventListener() {
    @Override public void onDataChange (DataSnapshot dataSnapshot){
        // code here does not get executed straight away,
        // it gets executed whenever data is received back from the remote database
    }

    @Override public void onCancelled (DatabaseError databaseError){

    }
});
// if you have a line of code here immediately after adding the listener
// the onDataChange code *won't have run*. You go straight to these lines
// of code, the onDataChange method will run whenever it's ready.
Run Code Online (Sandbox Code Playgroud)

所以这意味着如果你想对你所获得的数据做一些事情,onDataChange你应该把那些代码放在onDataChange方法中(或者从那里调用一些其他方法,或者在数据交付之后以其他方式运行该代码).

关于第二部分,稍微更多的Firebasey检查int是否存在并获取值的方法是:

@Override public void onDataChange (DataSnapshot dataSnapshot){
    if (dataSnapshot.exists()) {
        id = dataSnapshot.getValue(Integer.class);
    } else {
        id = 1;
    }
}
Run Code Online (Sandbox Code Playgroud)