【问题标题】:retrieve the value of an ArrayList inside a repeating function在重复函数中检索 ArrayList 的值
【发布时间】: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() 值返回并显示,但它的运行速度比预期的要快

【问题讨论】:

    标签: java loops firebase-realtime-database arraylist methods


    【解决方案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
            }
    
    

    【讨论】:

      猜你喜欢
      • 2019-06-20
      • 1970-01-01
      • 2011-06-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-07
      • 1970-01-01
      • 2014-09-20
      • 1970-01-01
      相关资源
      最近更新 更多