2017-06-11 36 views
1

ファイアベースのストレージに複数の画像をアップロードしようとしています。 私はこのために以下のコードを書かれている: -複数の画像をファイアベースのストレージにアップロードする

アップロードする少数の画像がある
private static void uploadImage(String imageUrl) 
    { 
     FirebaseStorage storage = FirebaseStorage.getInstance(); 
     final StorageReference storageRef = storage.getReferenceFromUrl("gs://image-store.appspot.com/"); 
     Uri file = Uri.fromFile(new File(imageUrl)); 
     String imageName = System.currentTimeMillis()+".jpg"; 
     StorageReference imageRef = storageRef.child("images").child(imageName); 
     UploadTask uploadTask = imageRef.putFile(file); 
    } 

    private static uploadImages(String[] imageUrls) 
    { 
     for(imageUrl : imageUrls) 
     { 
      uploadImage(imageUrl) 
     } 
    } 

は、上記のコードは正常に動作します。それはいくつかの非同期スレッドを作成し、次のエラーを与える100+の画像の周りがある場合でも、: -

Exception java.util.concurrent.RejectedExecutionException: Task [email protected] rejected from [email protected][Running, pool size = 2, active threads = 2, queued tasks = 128, completed tasks = 59] 
java.util.concurrent.ThreadPoolExecutor$AbortPolicy.rejectedExecution (ThreadPoolExecutor.java:2042) 
java.util.concurrent.ThreadPoolExecutor.reject (ThreadPoolExecutor.java:796) 
java.util.concurrent.ThreadPoolExecutor.execute (ThreadPoolExecutor.java:1370) 
com.google.firebase.storage.zzd.zzu() 
com.google.firebase.storage.UploadTask.schedule() 
com.google.firebase.storage.StorageTask.an() 
com.google.firebase.storage.StorageReference.putFile() 
com.indiacom.blanketfos.util.FirebaseUtil.uploadImage (FirebaseUtil.java:64) 
com.indiacom.blanketfos.util.FirebaseUtil.uploadImages (FirebaseUtil.java:126) 
com.indiacom.blanketfos.util.FirebaseUtil.syncRealmToFirebase (FirebaseUtil.java:33) 
com.indiacom.blanketfos.ui.FormActivity.onOptionsItemSelected (FormActivity.java:406) 
android.app.Activity.onMenuItemSelected (Activity.java:2983) 
android.support.v4.app.FragmentActivity.onMenuItemSelected (FragmentActivity.java:408) 
android.support.v7.app.AppCompatActivity.onMenuItemSelected (AppCompatActivity.java:195) 
android.support.v7.view.WindowCallbackWrapper.onMenuItemSelected (WindowCallbackWrapper.java:113) 
android.support.v7.app.AppCompatDelegateImplV9.onMenuItemSelected (AppCompatDelegateImplV9.java:675) 
android.support.v7.view.menu.MenuBuilder.dispatchMenuItemSelected (MenuBuilder.java:822) 
android.support.v7.view.menu.MenuItemImpl.invoke (MenuItemImpl.java:156) 
android.support.v7.view.menu.MenuBuilder.performItemAction (MenuBuilder.java:969) 
android.support.v7.view.menu.MenuBuilder.performItemAction (MenuBuilder.java:959) 
android.support.v7.widget.ActionMenuView.invokeItem (ActionMenuView.java:623) 
android.support.v7.view.menu.ActionMenuItemView.onClick (ActionMenuItemView.java:154) 
android.view.View.performClick (View.java:4781) 
android.view.View$PerformClick.run (View.java:19907) 
android.os.Handler.handleCallback (Handler.java:739) 
android.os.Handler.dispatchMessage (Handler.java:95) 
android.os.Looper.loop (Looper.java:160) 
android.app.ActivityThread.main (ActivityThread.java:5541) 
java.lang.reflect.Method.invoke (Method.java) 
java.lang.reflect.Method.invoke (Method.java:372) 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run (ZygoteInit.java:964) 
com.android.internal.os.ZygoteInit.main (ZygoteInit.java:759) 

だから私の質問は最高の着陸せずにfirebaseストレージに複数の画像をアップロードする最も効率的な方法は何かということですそのような問題に陥る。

+2

100イメージを並行してアップロードするのは悪い考えです。私はより合理的な数の並列アップロード(3-5など)を使用し、既存のアップロードが完了すると新しいアップロードを開始します([アップロードタスクからの進捗状況を監視できます](https://firebase.google .com/docs/storage/android/upload-files#monitor_upload_progress))。 –

+1

Executorをデバイス上のコアの数、例えば4に制限した場合、それは機能します。しかし、これによりすべてのことがかなり遅くなります。 Firebaseのリアルタイムデータベースへの投稿はOKですが、これは非常に高速ですが、アップロードは遅く、スレッドをつかむと思います。すべてのUploadTaskが完了したら、エグゼキュータで新しいrunnableタスクを開始する必要がありますか? –

+0

addOnCompleteListenerを使用してハンドラに空のメッセージを送信し、ダウンロード/アップロードを再開します。これは私のために働く。 –

答えて

0

私は同じ問題を抱えていましたが、Firebaseストレージは無料アカウントの同時アップロードを最大100件受け付けていることがわかりました。ここに私がしたことがあり、助けてくれることを願っています:

private static void uploadFS(final File[] files, final StorageReference certRef, int startIndex, int concurrent) { 
    int cnt = 0; 
    File file; 
    Uri uriFile; 
    StorageReference ref; 
    while (cnt < concurrent) { 
     file = files[startIndex]; 
     startIndex++; 
     if (file.exists() && file.length() > 0) { // local cert file exits 
      uriFile = Uri.fromFile(file); 
      final int sIdx = startIndex; 
      ref = certRef.child("cert/" + uriFile.getLastPathSegment()); 
      ref.putFile(uriFile).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() { 
       @Override 
       public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
        uploadFS(files, certRef, sIdx, 1); 
       } 
      }); 
     } 
     cnt++; 
    } 
} 
public static void uploadCert() { 
    StorageReference rootStorageRef = getStorageRefRoot(); 
    if (rootStorageRef != null) { // loop through download folder 
     File certFolder = new File(MainActivity.DOWNLOAD_FULL_PATH + "cert/"); 
     if (certFolder.isDirectory()) { 
      File[] certFiles = certFolder.listFiles(); 
      uploadFS(certFiles, rootStorageRef, 0, 3); // 3 is concurrent upload tasks 
     } 
    } 
} 
関連する問題