在重复函数中检索 ArrayList 的值

Posted

技术标签:

【中文标题】在重复函数中检索 ArrayList 的值【英文标题】:retrieve the value of an ArrayList inside a repeating function 【发布时间】:2022-01-24 03:16:09 【问题描述】:

我正在尝试检索函数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
                                                                 
                                     
                              

                                                                 

有问题的班级:

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() 值返回并显示,但它的运行速度比预期的要快

【问题讨论】:

【参考方案1】:

每次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
        

【讨论】:

以上是关于在重复函数中检索 ArrayList 的值的主要内容,如果未能解决你的问题,请参考以下文章

去重的方法(数组、字符串)

Firebase/Android:将检索到的值从 Firebase 添加到 arraylist 会返回空指针异常

怎么去除arraylist里重复的值

arraylist和linkedlist重大区别?

通过在 JavaScript 中检索它们的值来自动选择复选框 [重复]

从 hashmap 存储和检索 ArrayList 值