For循环在继续之前不要执行所有代码

时间:2018-09-18 22:11:21

标签: android firebase for-loop firebase-realtime-database

 for (int i = 1; i < 3; i++) {
        list.add(new Integer(i));
    }
    Collections.shuffle(list);

    for (int i = 0; i < 2; i++) {

        int r = list.get(i);
        numeroRandom = Integer.toString(r);
        Log.d("DEBUG", "teste random :" + list.get(i));
        Log.d("DEBUG", "numeroRandomGerado = " + numeroRandom);

        final DatabaseReference questaoRef = fireBaseRef.child("questoes");
        Log.d("DEBUG", "Loop Stop here");
        questaoRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {

                Log.d("DEBUG", "teste2");
                if (dataSnapshot != null) {
                    Questoes questoes = dataSnapshot.child("id").child(numeroRandom).getValue(Questoes.class);


                    Log.d("DEBUG", "teste3");
                    Questoes objetoQuestao = new Questoes();
                    objetoQuestao.setQuestao(questoes.getQuestao());
                    objetoQuestao.setOpcaoA(questoes.getOpcaoA());
                    objetoQuestao.setOpcaoB(questoes.getOpcaoB());
                    objetoQuestao.setOpcaoC(questoes.getOpcaoC());
                    objetoQuestao.setOpcaoD(questoes.getOpcaoD());
                    objetoQuestao.setResultado(questoes.getResultado());
                    listaQuestoes.add(objetoQuestao);
                    Log.d("DEBUG", "tamanho = " + listaQuestoes.size());


                }
                callBack.onCallback(listaQuestoes);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                throw databaseError.toException();
            }
        });

由于某种原因,我的循环在Log.d(“ DEBUG”,“ Loop Stop here”)上停止并返回到开始,并执行其余代码的2倍。

这是我从代码中获取的日志,由于某种原因,它停止了3°调试,然后重新启动并执行所有操作

teste random :1
numeroRandomGerado = 1
Loop stop here
teste random :2
numeroRandomGerado = 2
Loop stop here - teste 1
teste2
tamanho = 1
callback
teste2
teste3

正确的答案如下:

teste random :1
numeroRandomGerado = 1
Loop stop here - teste 1
teste2
teste3
tamanho = 1
callBack
teste random :2
numeroRandomGerado = 2
Loop stop here
teste2
teste3
tamanho = 2
callBack

1 个答案:

答案 0 :(得分:0)

这是因为onDataChange(DataSnapshot dataSnapshot)侦听器是执行异步的地方-而您希望同步执行。可能是因为它可能已经为.child("questoes")注册了另一个监听器,而先前注册的监听器尚未返回。尝试设置断点并进入其中,以查看执行的实际顺序。注册侦听器后添加Thread.sleep(2000);,很可能应该使它工作,就像您期望的那样。