2016-09-07 33 views
2

我正在玩弄Firebase存储,并将其加入照片收集应用程序,该应用程序将一组照片上传到Firebase存储后端。我想上传多张照片并等待所有任务完成,收集下载网址并继续下一步。这里是我的代码如下如何执行多个Firebase上传并等待集体搜索结果

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) { 

      } 
     }); 
    } 
} 

我想收集所有uris并使用存储在downloadUris中的结果。当我输入时,我意识到这可能不是一个火力点问题,但了解如何等待并行任务完成执行并继续执行结果。我怎样才能达到这个目标? 谢谢

+0

难道建议的回答可以帮助您的情况? –

回答

4

Play services Task API实际上支持大部分Firebase客户端异步API,例如Firebase存储文件上传。您拥有的UploadTask是接受成功和失败侦听器的标准Task的子类,就像您现在正在做的那样。

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

您可以在单个任务上以及从Tasks.whenAll()返回的复合任务上注册侦听器。

(同样,敬请关注一个upcoming blog series关于使用任务API的各种火力地堡的功能。)