Java - Android:等待来自firebase的addlistener结果

时间:2018-03-25 01:07:10

标签: android firebase asynchronous firebase-realtime-database

我为我的学校在android上创建了一个应用程序,但我阻止了异步问题:

databaseReference2.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(final DataSnapshot ds: dataSnapshot.getChildren()){
                Log.e("test","1");
                Menu = ds.getValue(menu.class);
                list2.add(Menu.getId().toString());

                databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                        try{
                            Log.e("test","2");
                            if(dataSnapshot.child("menuAjoute").child(mail).exists()){
                                    if(dataSnapshot.child("menuAjoute").child(mail).child(Menu.getId()).getValue().equals(Menu.getId())) {
                                        list.add(Menu.getNom()); 
                                    }
                            }
                        }catch (Exception e) {
                            e.printStackTrace();
                        }
                    }
                    @Override
                    public void onCancelled(DatabaseError databaseError) {
                    }
                });
                Log.e("test","3");
            }

要使我的代码工作,第2步必须在第3步之前。但我还没有找到办法。什么是最简单的方法? (我搜索了解决方案,但没有一个工作)。

2 个答案:

答案 0 :(得分:0)

Firebase侦听器是异步的,这意味着它不会等到数据被提取,这意味着将继续执行以下代码行,并且在某些时候它将从数据库中提取数据。我建议你将第3步放在听众中

try{
                            Log.e("test","2");


    if(dataSnapshot.child("menuAjoute").child(mail).exists()){
                                    if(dataSnapshot.child("menuAjoute").child(mail).child(Menu.getId()).getValue().equals(Menu.getId())) {
                                        list.add(Menu.getNom()); 
                                    }
                            }
                        }catch (Exception e) {
                            e.printStackTrace();
                        }

Log.e("test", "3")

答案 1 :(得分:0)

没有好办法在Android中强制等待。如果要在步骤3之前完成步骤2,则应将步骤2移到步骤2完成时调用的方法中。所以:

databaseReference2.addValueEventListener(new ValueEventListener() {
    @Override
    public void onDataChange(DataSnapshot dataSnapshot) {
        for(final DataSnapshot ds: dataSnapshot.getChildren()){
            Log.e("test","1");
            Menu = ds.getValue(menu.class);
            list2.add(Menu.getId().toString());

            databaseReference.addListenerForSingleValueEvent(new ValueEventListener() {
                @Override
                public void onDataChange(DataSnapshot dataSnapshot) {
                    try{
                        Log.e("test","2");
                        if(dataSnapshot.child("menuAjoute").child(mail).exists()){
                                if(dataSnapshot.child("menuAjoute").child(mail).child(Menu.getId()).getValue().equals(Menu.getId())) {
                                    list.add(Menu.getNom()); 
                                }
                        }
                        Log.e("test","3");
                    }catch (Exception e) {
                        e.printStackTrace();
                    }
                }
                @Override
                public void onCancelled(DatabaseError databaseError) {
                    throw databaseError.toException();
                }
            });
        }

另见: