这是我的代码:
public ArrayList<Integer> getArray() {
final FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference myReff =database.getReference("server").child("user");
myReff.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
boolean connected = dataSnapshot.getValue(Boolean.class);
if (connected){
Log.d("CONNECT","YES");
}
else {
Log.d("CONNECT","NO");
}
GenericTypeIndicator<ArrayList<Integer>> genericTypeIndicator = new GenericTypeIndicator<ArrayList<Integer>>() {};
array = dataSnapshot.getValue(genericTypeIndicator) ;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
return array;
}
这是我的数据库:
"server" : {
"user" : {
1 : 0,
2 : 0,
3 : 0
},
}
这段代码的目的是在我的数据库中检索一个数组。
问题是 OnDataChange 从未在这个函数中被调用
(我调试了我的代码,在其中放置了断点,但什么也没发生。并且 CONNECT 未显示在 Logcat 中)。
我不明白为什么,因为在添加监听器的时候,即使数据没有变化,ondatachange也必须至少触发一次。
你能解释一下为什么 OnDataChange 没有被执行吗?
最佳答案
当您添加 ListenerForSingleValueEvent
时或任何其他 Firebase 监听器,发生的情况是您的手机启动连接到互联网的服务并在他获得结果后返回结果。
当您的手机连接到 firebase 服务器并返回数据时,您的函数 ( public ArrayList<Integer> getArray()
) 已经完成。该函数不会等待数据返回,它会继续。
最终,当您的数据从 Firebase 数据库返回时,它会调用函数 public void onDataChange(DataSnapshot dataSnapshot)
或到 function public void onCancelled(DatabaseError databaseError)
您已在 new ValueEventListener(){}
中声明
所以,在你的情况下,如果你想返回数组,你需要从 onDataChange(DataSnapshot dataSnapshot)
调用另一个函数函数并将数组作为参数传递。
例如:
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
boolean connected = dataSnapshot.getValue(Boolean.class);
if (connected){
Log.d("CONNECT","YES");
}
else {
Log.d("CONNECT","NO");
}
GenericTypeIndicator<ArrayList<Integer>> genericTypeIndicator = new GenericTypeIndicator<ArrayList<Integer>>() {};
array = dataSnapshot.getValue(genericTypeIndicator);
handleArrayFunction(array);
}
在你的public ArrayList<Integer> getArray()
之外function 像这样声明一个新函数:
private void handleArrayFunction(ArrayList<Integer> array){
//use your array for what you want
}
希望我是可以理解的! 如果有什么不够清楚,请随意说:)
关于java - onDataChange 永远不会执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48673789/