【发布时间】:2021-06-25 13:01:57
【问题描述】:
我有一个字符串数组列表,用于存储图像 URL。 在 for 循环中,我每次都向 ArrayList 添加一个值,但在 for 循环之后,ArrayList 似乎会自行重置。
for (int i = 0; i < imageUris.size(); i++) {
imageFilePath = storageReference.child(imageUris.get(i).getLastPathSegment());
StorageReference finalImageFilePath = imageFilePath;
imageFilePath.putFile(imageUris.get(i)).addOnSuccessListener(taskSnapshot -> {
finalImageFilePath.getDownloadUrl().addOnSuccessListener(uri -> {
String imageUrl = uri.toString();
imageUrls.add(imageUrl); // Here I'm adding to the ArrayList
Log.d("test1", String.valueOf(imageUrls.size())); // the size is 1
});
}
Log.d("test2", String.valueOf(imageUrls.size())); // the size is 0
编辑:
我无法回答我自己的问题,所以这里是解决方案(可以在 cmets 中看到):
这里的问题是我更新了addOnSuccessListener 中的列表,因为这个函数在另一个线程上工作,代码继续运行,因此它以第一种形式打印列表(在添加 url 之前)。
【问题讨论】:
-
您在成功监听器中添加到
imageUrls;但是最后的Log.d行会立即执行。您需要等到一切顺利。 -
作为@Andy Turner,成功侦听器在另一个线程上或在主循环器的稍后更新滴答中执行(在您的方法已经完成之后)。所以当你调用 'Log.d("test2", String.valueOf(imageUrls.size()));' 时列表是空的
-
@IdoBarnea 当成功的监听器全部执行完毕。
-
imageUrlsArrayList 在您的代码中是本地的,因此会导致这种情况。 -
成功了!谢谢!
标签: java android firebase firebase-storage