当我想从Firebase数据库获取值并从方法返回值时,我遇到了问题。
我知道它是异步的,onDataChange
是在" return"之后执行的。从一个方法中得到的价值,我发现了很多关于这个问题的主题,但是我无法找到返回它的必须做的事情。
这是我的简单方法:
private int getScore(String word) {
Log.e("DTAG", "order 1");
String userId = getFirebaseUserId();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Words").child(word).child(userId).child("score");
rootRef.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
oldScore = Integer.parseInt(dataSnapshot.getValue().toString());
Log.e("DTAG", "order 3");
}
@Override
public void onCancelled(DatabaseError databaseError) {}
});
Log.e("DTAG", "order 2");
return oldScore;
}
答案 0 :(得分:1)
既然你知道它是异步的,那就意味着你不知道什么时候会完成它。
解决问题的几种方法是:
第一个选项回调:
您可以创建自己的回调,例如:
interface OnCompletion {
onComplete(object: Object)
onFailure(message: String)
}
然后在方法中使用该回调:
private void getFromDb(String word, completion: onCompletion){
Log.e("DTAG", "order 1");
String userId = getFirebaseUserId();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Words").child(word).child(userId).child("score");
rootRef.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
completion.onComplete('Pass something');
}
@Override
public void onCancelled(DatabaseError databaseError) {
completion.onFailure('Pass something');
}
});
}
然后你称之为:
getFromDb("test", new OnCompletion() {
onComplete(object: Object) {
//Cast it and access the data here
}
onFailure(message: String) {
//access the data here
}
} ){
答案 1 :(得分:0)
试试这个。
private void getFromDb(String word){
Log.e("DTAG", "order 1");
String userId = getFirebaseUserId();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference().child("Words").child(word).child(userId).child("score");
rootRef.addListenerForSingleValueEvent(
new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
getScore(Integer.parseInt(dataSnapshot.getValue().toString()));
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
}
private int getScore(int score){
Log.v("score",String.valueOf(score);
return score
}