addressF1和addressRespuestas是在oncreate之前初始化的ArrayList。我尝试此方法后,这些数组列表都为空。我该如何解决?
调用此方法后,将使用日志检查阵列列表。两者都是空的。
for (int i = 0; i < imagenesRespuestas.size(); i++) {
addressF1 = new ArrayList<>();
for (int j = 0; j < imagenesRespuestas.get(i).size(); j++) {
final String fotoIdResps = imagenesRespuestas.get(i).get(j);
if (!(fotoIdResps.equals("1")))
{
storageReference.child(tit1).child(imagenesRespuestas.get(i).get(j)).putFile(Uri.parse(dataQuiz.getLinkRespuestasFotos().get(i)
.get(j))).continueWithTask(new Continuation<UploadTask.TaskSnapshot, Task<Uri>>() {
@Override
public Task<Uri> then(@NonNull Task<UploadTask.TaskSnapshot> task) throws Exception {
if (!task.isSuccessful()) {
throw task.getException();
}
return storageReference.child(tit1).child(fotoIdResps).getDownloadUrl();
}
}).addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
addressF1.add(task.getResult().toString());
}
});
}
else {
addressF1.add("1");
}
}
addressRespuestas.add(addressF1);
}
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的描述来看,你遇到的问题可能是异步操作完成之前就检查了ArrayList的内容。在Android开发中,特别是使用诸如Firebase的addOnCompleteListener
这类异步回调时,你需要确保数据加载完毕后再去检查或使用这些数据。
基于你的代码片段,我推测你是想从Firebase Storage下载URL并将它们添加到ArrayList中。由于getDownloadUrl()
是一个异步操作,你不能直接在调用后立即检查ArrayList是否已填充,因为回调可能还没有执行完成。
解决方法是将你想要执行的操作(比如检查ArrayList内容或更新UI)放在异步操作完成的回调里,确保所有数据都已经加载完毕。一个简单的调整方案如下:
// 假设addressF1和addressRespuestas是在onCreate之前初始化的
for (int i = 0; i < someCondition; i++) { // 确保someCondition有正确的值
ArrayList<String> addressF1 = new ArrayList<>();
for (int j = 0; j < anotherCondition; j++) { // 同样,anotherCondition需要有正确的值
storageReference.child(tit1).child(fotoIdResps).getDownloadUrl().addOnCompleteListener(new OnCompleteListener<Uri>() {
@Override
public void onComplete(@NonNull Task<Uri> task) {
if (task.isSuccessful()) {
addressF1.add(task.getResult().toString());
// 这里确保了数据添加进ArrayList后再进行后续操作
Log.d("TAG", "AddressF1 size after adding: " + addressF1.size());
// 如果这是循环中的最后一个任务,可以在这里处理addressRespuestas
if (/* 判断是最后一个j */) {
addressRespuestas.add(addressF1);
// 在这里检查或使用addressRespuestas
Log.d("TAG", "addressRespuestas size: " + addressRespuestas.size());
}
} else {
addressF1.add("1"); // 或者处理错误情况
Log.e("TAG", "Error getting download URL: " + task.getException());
}
}
});
}
}
请注意,如果storageReference.child(tit1).child(fotoIdResps).getDownloadUrl()
是在循环中多次调用的,且你希望等待所有这些异步操作都完成后再继续,你可能需要考虑使用其他同步机制,如CountDownLatch
或者封装这些操作到一个自定义的AsyncTask中,并在onPostExecute
中处理最终结果。
总之,关键是理解并正确处理异步操作,确保在数据准备就绪后再进行下一步逻辑处理或检查。