这是我的代码,我不知道为什么循环完成,然后addListenerForSingleValueEvent启动执行,我做错了什么???
firebase.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot itemDataSnapshot : dataSnapshot.getChildren()) {
fb.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot xdataSnapshot) {
Toast.makeText(getApplicationContext(), "YYYYYYY", Toast.LENGTH_LONG).show();
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
Toast.makeText(getApplicationContext(), "XXXXXX", Toast.LENGTH_LONG).show();
}
}
@Override
public void onCancelled(FirebaseError firebaseError) {
}
});
循环是3次,上面代码的结果是Toast XXXXX apear 3次然后Toast YYYYYYY apear 3次,为什么????我想Toast YYYYY然后Toast XXXXX再次3次。
答案 0 :(得分:3)
当您致电addListenerForSingleValueEvent()
时,您开始从Firebase服务器加载引用的数据。这可能需要一些时间,这就是您传入回调ValueEventListener
对象的原因。当数据可用时,Firebase将调用其onDataChange()
方法。
所以最初发生的事情是:
app Firebase
Server
--Get item 1-->
--Get item 2-->
--Get item 3-->
现在Firebase服务器需要一些时间来为您获取这些项目。它们可能需要从磁盘加载,或者至少,应用程序和服务器之间可能存在相当大的距离。
与此同时,您的应用程序将继续运行,并在您附加侦听器时执行该行:
Toast.makeText(getApplicationContext(), "XXXXXX", Toast.LENGTH_LONG).show();
执行三次,因此您会看到三个XXXXXX
祝酒词。
到目前为止,数据可能会从Firebase服务器返回到应用程序中:
app Firebase
Server
<-- Item 1 --
<-- Item 2 --
<-- Item 3 --
对于每个代码,您的代码都会显示YYYYYYY
吐司。
吐司的用例对我来说没什么意义。但你可以通过循环两次孩子来完成它:
firebase.addValueEventListener(new ValueEventListener() {
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot itemDataSnapshot : dataSnapshot.getChildren()) {
Toast.makeText(getApplicationContext(), "XXXXXX", Toast.LENGTH_LONG).show();
}
for (DataSnapshot itemDataSnapshot : dataSnapshot.getChildren()) {
fb.addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot xdataSnapshot) {
Toast.makeText(getApplicationContext(), "YYYYYYY", Toast.LENGTH_LONG).show();
}
public void onCancelled(FirebaseError firebaseError) {}
});
}
}
public void onCancelled(FirebaseError firebaseError) {
}
});