Firebase addListenerForSingleValueEvent稍后在循环中执行 [英] Firebase addListenerForSingleValueEvent excute later in loop

查看:45
本文介绍了Firebase addListenerForSingleValueEvent稍后在循环中执行的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

这是我的代码,我不知道循环为什么结束,然后addListenerForSingleValueEvent开始执行,我做错了什么?

This's my code, i don't know why the loop finished, then addListenerForSingleValueEvent start excute, what did i do wrong???

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出现3次,然后Toast YYYYYYY出现3次,为什么???我想先祝酒YYYYY,再祝酒XXXXX,再3次.

The loop is 3 time and The result of above code is Toast XXXXX apear 3 time and then Toast YYYYYYY apear 3 time, why???? i want to Toast YYYYY and then Toast XXXXX and again 3 time.

推荐答案

调用 addListenerForSingleValueEvent()时,您开始从Firebase服务器加载引用的数据.这可能需要一些时间,这就是为什么您传递回调 ValueEventListener 对象的原因.当数据可用时,Firebase将调用其 onDataChange()方法.

When you call addListenerForSingleValueEvent() you start loading the referenced data from the Firebase servers. This may take some time, which is why you pass in a callback ValueEventListener object. When the data is available, Firebase will call its onDataChange() methods.

所以最初发生的是:

    app                 Firebase
                         Server

        --Get item 1-->
        --Get item 2-->
        --Get item 3-->

现在,Firebase服务器需要一些时间才能为您获取这些物品.它们可能需要从磁盘加载,或者至少需要在应用程序和服务器之间保持一定距离.

Now the Firebase servers need some time to get these items for you. They may need to be loaded from disk or at the very least, there may be quite some distance between the app and the servers.

与此同时,您的应用程序将继续运行并在您附加监听器的右行执行

In the meantime your app continues running and executes the line right you attach the listener:

Toast.makeText(getApplicationContext(), "XXXXXX", Toast.LENGTH_LONG).show();

这将执行3次,因此您会看到3个 XXXXXX 吐司.

This executes three times, so you see three XXXXXX toasts.

现在,数据可能已从Firebase服务器返回到应用程序中:

By now the data is probably coming back from the Firebase servers into the app:

    app                 Firebase
                         Server

        <--  Item 1  --
        <--  Item 2  --
        <--  Item 3  --

对于每个代码,您的代码都显示 YYYYYYY 吐司.

And for each of these your code shows a YYYYYYY toast.

用烤面包片的用例对我来说毫无意义.但是,您可以通过遍历子对象两次来实现此目的:

The use-case with the toasts makes little sense to me. But you can accomplish it by looping over the children twice:

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

这篇关于Firebase addListenerForSingleValueEvent稍后在循环中执行的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆