2016-09-07 35 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的各種火力地堡的功能。)