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)
从这个问题中可以想到两件事,一个关于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)
| 归档时间: |
|
| 查看次数: |
7779 次 |
| 最近记录: |