1
我試圖將幾張圖片上傳到firebase存儲。 我寫了下面的代碼如下: -將幾張圖片上傳到firebase存儲
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)
所以我的問題是什麼是最好的,並上傳多張圖像到存儲火力無落地的最有效的方法陷入這樣的問題。
並行上傳100個圖像聽起來像一個壞主意。我會使用更合理的並行上傳數量(比如3-5),並且只有在現有的一個上傳完成後才啓動新的上傳(您可以[監控上傳任務的進度](https://firebase.google .COM /文檔/存儲/安卓/上傳,文件#monitor_upload_progress))。 –
如果您將Executor限制爲設備上的核心數量,請說4,然後運行。但是,這當然會讓事情變得更慢。發佈到Firebase實時數據庫是可以的,但我想這是非常快的,而上傳速度很慢,抓住一個線程。也許你只有在所有UploadTasks完成後才能在執行器中啓動一個新的runnabletask? –
使用addOnCompleteListener向您的處理程序發送一條空消息,以便重新開始下載/上傳。這對我有用。 –