使用 Java 中的 StorageReference 将数据从 Firebase Storage 添加到 ArrayList

问题描述 投票:0回答:1

我正在尝试从 FireBase 存储中检索文件夹名称并将它们添加到我的 ArrayList 中:

public class NewActivity extends AppCompatActivity {
    
    List<Article> articles = new ArrayList<>()

    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_themes);

    FirebaseApp.initializeApp(NewActivity.this);
    FirebaseDatabase database = FirebaseDatabase.getInstance();
    FirebaseStorage storage = FirebaseStorage.getInstance();

    StorageReference reference = storage.getReference("themes");
    reference.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
        @Override
        public void onSuccess(ListResult listResult) {
            for (StorageReference prefix: listResult.getPrefixes()) {
                articles.add(new Article(prefix.getName()));
            }
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            e.printStackTrace();
        }
    });

最后,在 Activity 停止运行后,我仍然有一个空的 ArrayList,没有保存任何文件夹的名称(实际上引用“主题”有几个文件夹)。我已经读过,“addOnSuccessListener 是异步的并立即返回。回调会在一段时间后调用。并且还应使用 Tasks.whenAll() 来获取数据”。但我不知道如何将它实现到我的代码中......我需要你的帮助。

java firebase-storage
1个回答
0
投票

您是对的,Firebase 存储操作是异步的,您提供的代码可能无法保证 articles 列表按您期望的方式填充。为了确保仅在从 Firebase 存储检索所有数据后才填充您的 articles 列表,您可以使用

Tasks.whenAll()
来处理异步调用。您可以通过以下方式修改代码来实现此目的:

public class NewActivity extends AppCompatActivity {

    List<Article> articles = new ArrayList<>();

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_themes);

        FirebaseApp.initializeApp(NewActivity.this);
        FirebaseDatabase database = FirebaseDatabase.getInstance();
        FirebaseStorage storage = FirebaseStorage.getInstance();

        StorageReference reference = storage.getReference("themes");
        Task<ListResult> listTask = reference.listAll();

        listTask.addOnSuccessListener(new OnSuccessListener<ListResult>() {
            @Override
            public void onSuccess(ListResult listResult) {
                List<Task<Void>> tasks = new ArrayList<>();

                for (StorageReference prefix : listResult.getPrefixes()) {
                    Task<String> nameTask = prefix.getName();

                    // Create a new task for each folder name retrieval
                    tasks.add(nameTask.onSuccessTask(new OnSuccessListener<String>() {
                        @Override
                        public void onSuccess(String name) {
                            articles.add(new Article(name));
                            return null;
                        }
                    }));
                }

                // Wait for all tasks to complete before proceeding
                Tasks.whenAll(tasks).addOnSuccessListener(new OnSuccessListener<Void>() {
                    @Override
                    public void onSuccess(Void aVoid) {
                        // Do something with the populated 'articles' list
                        // This will be executed after all folder names are retrieved
                    }
                }).addOnFailureListener(new OnFailureListener() {
                    @Override
                    public void onFailure(@NonNull Exception e) {
                        e.printStackTrace();
                    }
                });
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                e.printStackTrace();
            }
        });
    }
}

在此代码中:

1. 我们创建一个任务列表,用于使用 nameTask 检索文件夹名称。

2. 我们使用onSuccessTask为每个文件夹名称创建一个新任务 恢复。这允许您将文件夹名称添加到文章列表中 并继续任务链。

3. 我们使用Tasks.whenAll(tasks)来等待所有任务完成, 在继续之前确保文章列表已完全填充 任何进一步的行动。

4. 现在,只有在之后,文章列表才会填充文件夹名称 所有数据已成功从 Firebase 存储中检索。

© www.soinside.com 2019 - 2024. All rights reserved.