开发者社区 问答 正文

使用Android的Firebase将图像URL从内部类数据添加到ArrayList

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);
        }

展开
收起
Puppet 2019-12-04 15:12:06 502 分享 版权
阿里云 AI 助理回答

从你的描述来看,你遇到的问题可能是异步操作完成之前就检查了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中处理最终结果。

总之,关键是理解并正确处理异步操作,确保在数据准备就绪后再进行下一步逻辑处理或检查。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答