Firebase addListenerForSingleValueEvent稍后在循环中执行

时间:2016-03-11 23:19:49

标签: android firebase

这是我的代码,我不知道为什么循环完成,然后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次。

1 个答案:

答案 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) {
  }
});