当前位置: 首页 > 知识库问答 >
问题:

如何执行多个firebase上载并等待集合结果

澹台举
2023-03-14

我正在玩Firebase Storage烘烤成一个照片收集应用程序,收集照片并上传到Firebase Storage后端。我想上传多张照片并等待所有任务完成,收集下载URL并进行下一步。下面是我的代码

    public void saveImageData() {
    Incident incident = new Incident();
    final ArrayList<Uri> downloadUris = new ArrayList<>();

    StorageReference storageRef = storage.getReferenceFromUrl(Constants.FIREBASE_URL);
    for (Uri uri : imageUris) {
        StorageReference imagesRef = storageRef.child("images/" + uri.getLastPathSegment());
        uploadTask = imagesRef.putFile(uri);
        uploadTask.addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
            @Override
            public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
                downloadUris.add(taskSnapshot.getDownloadUrl());
                Log.e(TAG, "Size of data: " + downloadUris.size());
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {

            }
        });
    }
}

我希望收集所有的URI,并使用DownloadURI中存储的结果。当我输入这个时,我意识到这可能不是firebase的问题,而是理解如何等待并行任务完成,执行并继续处理结果。我怎样才能达到这个目标呢?谢谢

共有1个答案

常自强
2023-03-14

Play services任务API实际上支持Firebase客户端的许多异步API,例如Firebase存储文件上载。您拥有的UploadTask是接受成功和失败侦听器的标准任务的一个子类,正如您现在所做的那样。

如果您正在处理多个并发上载,并且希望知道所有上载何时完成,那么可以使用Tasks实用工具类,它有一个whenAll()方法,可以接受多个Task对象。该方法将返回一个新任务,您可以在其中注册额外的成功和失败侦听器。当所有任务完成后,将立即调用成功侦听器,当任何任务失败时,将调用失败侦听器。

您既可以在单个任务上注册侦听器,也可以在从tasks.WhenAll()返回的复合任务上注册侦听器。

(另外,请继续关注即将发布的关于Task API与各种Firebase特性的使用的博客系列。)

 类似资料:
  • 返回的流量 返回一个 如果您不能回答我的问题,请至少告诉我如何并行地执行多个API调用,并在WebClient中等待结果

  • 问题内容: 我有两个分开的阻塞队列。客户端通常使用第二个阻塞队列中的第一个来检索要处理的元素。 在某些情况下,客户端对两个阻塞队列中的元素感兴趣,无论哪个队列首先提供数据。 客户端如何并行等待两个队列? 问题答案: 您可以尝试在某种循环中使用该方法,以仅在指定时间量内等待一个队列,然后再轮询另一个队列。 除此之外,我会说在另一个线程上为每个队列运行阻塞操作并为您的主应用程序提供回调接口是另一个稍微

  • 问题内容: 如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案 确实 并行运行这两个操作,但如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。 如果您只想启动它们,并行运行它们,并获得

  • 问题内容: 我如何更改以下代码,以触发两个异步操作并有机会同时运行? 我需要做这样的事情吗? 问题答案: TL; DR 不要在获得承诺的问题中使用模式,而是分别等待它们;而是使用(至少现在): 虽然您的解决方案确实并行运行这两个操作,但是如果两个诺言都被拒绝,它就无法正确处理拒绝。 细节: 您的解决方案并行运行它们,但始终等待第一个完成,然后再等待第二个。如果您只想启动它们,并行运行它们,并获得两

  • 现在我有了几个Lucene索引集(我称之为shards),它对不同的文档集进行索引。它们是独立的,这意味着我可以在它们中的每一个上执行搜索,而不必阅读其他的。然后我得到一个查询请求。我想在每个索引集上搜索它,并结合结果形成最终的顶级文档。 我知道,在给文档打分时,Lucene需要知道每个术语的 ,不同的索引集会给同一个术语不同的 (因为不同的索引集持有不同的文档集)。因此,根据我的理解,我不能直接

  • 问题内容: 假设有一个函数,应该执行一个HTTP请求并将其用于该请求。 如果在循环中调用if ,我希望下一个请求是在上一个完成之后执行的(串行执行,一个接一个)。为了不使回调和Promises混乱,我想使用async / await模式(与Babel.js一起编译以与Node 6+一起运行)。 但是,我不清楚如何等待响应对象进行进一步处理,以及如何作为以下结果返回它: 如果我使用 mocha 为H