2016-11-15 3 views
0

誰も助けてください。非同期の複数の写真がFirebaseでアップロードされます

Firebaseで複数の写真をアップロードする際に問題があります。私の問題は、UploadTaskがアップロードされる写真をループするときに、別のスレッドで動作するように見えるので、最初の写真がまだアップロードされている間にループがすべての写真を繰り返し処理するようになります。 ループを1つずつアップロードしたいので最初の写真は

@Override 
public boolean onOptionsItemSelected(final MenuItem item) { 
    switch(item.getItemId()){ 
     case R.id.add_photo_option: 
      item.setEnabled(false); 
      final ProgressDialog dialog = new ProgressDialog(getActivity()); 
      dialog.setProgressStyle(ProgressDialog.STYLE_SPINNER); 
      for (int x = 0; x < photosList.getAdapter().getItemCount(); x++){ 
       int photoNumber = x+1; 
       dialog.setTitle("Uploading photo no: " + photoNumber); 
       dialog.show(); 
       ImageAdapter adapter = (ImageAdapter) photosList.getAdapter(); 
       Uri photoUri = adapter.getPhotoUri(x); 
       String path = "photos/" + UUID.randomUUID() + ".png"; 
       StorageReference storage = mStorageRef.getReference(path); 
       UploadTask task = storage.putFile(photoUri); 
       task.addOnProgressListener(getActivity(), new OnProgressListener<UploadTask.TaskSnapshot>() { 
        @Override 
        public void onProgress(UploadTask.TaskSnapshot taskSnapshot) { 
         long progress = taskSnapshot.getBytesTransferred(); 
         long totalBytes = taskSnapshot.getTotalByteCount(); 
         dialog.setMessage("Uploading: " + progress + " KBs out of " + totalBytes + " KBs"); 
        } 
       }); 
       task.addOnSuccessListener(getActivity(), new OnSuccessListener<UploadTask.TaskSnapshot>() { 
        @Override 
        public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) { 
         dialog.setMessage("Uploaded"); 
         item.setEnabled(true); 
         Toast.makeText(getActivity(), taskSnapshot.getDownloadUrl().toString(), Toast.LENGTH_SHORT).show(); 
        } 
       }); 
      } 
      dialog.dismiss(); 
      return true; 
     default: 
     return super.onOptionsItemSelected(item); 
    } 
} 

答えて

0

をアップロードされていない限り(ちょうどJSのためにそれに答え)私は、アルゴリズムのためにあなたを与えることができます次の写真に反復:

// set it up 
firebase.storage().ref().constructor.prototype.putFiles = function(files) { 
    var ref = this; 
    return Promise.all(files.map(function(file) { 
    return ref.child(file.name).putFile(file); 
    })); 
} 

// use it! 
firebase.storage().ref().putFiles(files).then(function(metadatas) { 
    // Get an array of file metadata 
}).catch(function(error) { 
    // If any task fails, handle this 
}); 

あなたは、Android Tasks.whenAlldocsを使用することができます、blog post)同様のことをする:タスクの配列を作成し、次にそれらを蹴るためにwhenAll()を使用してください。

+0

Android metodのputFilesはまだありません! :( –

+0

しかし、あなたは 'putFile'(https://firebase.google.com/docs/storage/android/upload-files#upload_from_a_local_file)を使って簡単に実装し、上記のような' putFiles'関数を作成することができます。 –