在重复函数中检索 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 会返回空指针异常