【问题标题】:ArrayList resets itself [duplicate]ArrayList 自行重置[重复]
【发布时间】: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 当成功的监听器全部执行完毕。
  • imageUrls ArrayList 在您的代码中是本地的,因此会导致这种情况。
  • 成功了!谢谢!

标签: java android firebase firebase-storage


【解决方案1】:

确保您的 imageUrls 变量实例变量不是局部变量。如果是局部变量,则将其保留在特定方法之外。

【讨论】:

    【解决方案2】:

    也许你把这个数组作为本地的所以在 oncrate 之前把这个代码 ArrayList&lt;String&gt; imageUrls=new ArrayList&lt;&gt;(); 现在变量是全局的 如果你想保存 ArrayList 直到应用程序关闭,只需将数组设为静态

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-10
      • 1970-01-01
      • 2016-07-08
      • 2018-05-29
      • 2016-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多