在重复函数中检索 ArrayList 的值

retrieve the value of an ArrayList inside a repeating function

我正在尝试检索在函数 recuperarPessoasModelo() 中生成的数组列表,但它只比我需要的晚 运行 秒,因此传递给 revelaPessoas() 的值为空,有谁知道我可以 运行 这个函数并在 recuperarPessoasModelo() 执行后得到值吗?我不能把它放在里面,因为它有一个 for 循环,它将 运行 X 次并生成一个重复列表

数据库中的 .Json 如下所示:

Perfil{
       PcCPoh01wscJj7jJBQQorme7Rqq1{
                                    status:online
                                    name: Carl Johnson
                                    age: 21 
                                    sex: male}
       t3IeEKy7XxdGeLYRxw2G1djNHdp2{
                                    status:online
                                    name: John Marston
                                    age: 33 
                                    sex: male}
}
Requisicoes{
 t3IeEKy7XxdGeLYRxw2G1djNHdp2{
                             Enviadas{
                                     PcCPoh01wscJj7jJBQQorme7Rqq1{
                                                             idPessoa:PcCPoh01wscJj7jJBQQorme7Rqq1
                                                             status: Aguardando
                                                                 }
                                     }
                              }
}
                                                                 

有问题的class:

public class Perfil_outter extends AppCompatActivity{

    private List <RequisicoesCitty> requisicao = new ArrayList<>();
    private List <ModeloPerfil> pessoaQuestao = new ArrayList<>();
    private String idComp;

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
     
     carregarIds();
     revelaPessoa()
    }

    public List<ModeloPerfil> getPessoaQuestao() {
        return pessoaQuestao;
    }

    public void setPessoaQuestao(List<ModeloPerfil> pessoaQuestao) {
        this.pessoaQuestao = pessoaQuestao;
    }

    public void carregarIds(){
        Log.d("Part 1", "Working");

        DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();
        DatabaseReference idsRef = firebaseRef.child("Requisicoes");
        Query refId = idsRef.child(usuarioAtual.getId()).child("Enviadas").orderByChild("id");
        refId.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {


                for(DataSnapshot ds: snapshot.getChildren()) {
                    RequisicoesCitty reqSnapshots = ds.getValue(RequisicoesCitty.class);
                    Log.d("IdPessoas",reqSnapshots.getIdPessoa());
                    requisicao.add(reqSnapshots);
                }
                carregarRequisicoes();
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    public void carregarRequisicoes(){

        if(requisicao.isEmpty()){
            Log.d("Não encontrado", "Nenhuma requisição Citty");
        }

        for(RequisicoesCitty requisicao: requisicao) {
            Log.d("Part 2", "Working");
            DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();
            Query requisicoesEnviadas = firebaseRef.child("Requisicoes").child(usuarioAtual.getId())
                    .child("Enviadas").child(requisicao.getIdPessoa());

            requisicoesEnviadas.addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    RequisicoesCitty reqSnap = snapshot.getValue(RequisicoesCitty.class);
                    idComp = reqSnap.getIdPessoa();
                    recuperarPessoasModelos();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });
        }
    }



    public void recuperarPessoasModelos(){
        Log.d("Part 3", "Working");

        DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();
        Query pessoas = firebaseRef.child("Perfil").child(idComp);
        pessoas.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {

                ModeloPerfil pessoas = snapshot.getValue(ModeloPerfil.class);
                pessoaQuestao.add(pessoas);
                setPessoaQuestao(pessoaQuestao);
            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
    }

    public void revelaPessoas(){

        for(ModeloPerfil modelo: getPessoaQuestao()){
            Log.d("Funcionar", modelo.getNome());
        }
    }
}

你明白我的问题了吗?我的目标是获取 revelaPessoas 内部的值 modelo.getNome() 并显示,但它 运行 比它应该

每次 carregarRequisicoes 循环通过其 for(RequisicoesCitty requisicao: requisicao) { 之一时,您都在调用 recuperarPessoasModelos。这完全没问题,但我猜 recuperarPessoasModelos 没有正确处理这些多次调用。

如果您只想在所有 requisicao 完成后调用 recuperarPessoasModelos,您可以像这样检查计数器:

List snapshots = new List(); //  a list to track the snapshots we have already loaded
for(RequisicoesCitty requisicao: requisicao) {
    Log.d("Part 2", "Working");
    DatabaseReference firebaseRef = ConfiguracaoFirebase.getFirebaseDatabase();
    Query requisicoesEnviadas = firebaseRef.child("Requisicoes").child(usuarioAtual.getId())
            .child("Enviadas").child(requisicao.getIdPessoa());

    requisicoesEnviadas.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            snapshots.add(snapshot); //  add snapshot to list
            RequisicoesCitty reqSnap = snapshot.getValue(RequisicoesCitty.class);
            idComp = reqSnap.getIdPessoa();
            if (snapshots.size() == requisicao.size()) { //  check if we got all of them
                recuperarPessoasModelos();
            }
        }
    
        @Override
        public void onCancelled(@NonNull DatabaseError error) {
            throw error.toException(); //  never ignore errors
        }