这是我的代码:
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侦听器时,发生的情况是您的电话启动了一项服务,该服务可以连接到Internet,并在获得电话后返回结果。
当您的手机连接到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()
函数之外,声明一个新函数,如下所示: private void handleArrayFunction(ArrayList<Integer> array){
//use your array for what you want
}
希望我可以理解!
如果有什么不清楚的地方,可以这样说:)