使用Firebase上传异步多张照片 [英] Asynchronous multiple photos upload with Firebase

查看:297
本文介绍了使用Firebase上传异步多张照片的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述



使用Firebase上传多张照片时出现问题。我的问题是,当我循环的照片上传UploadTask似乎工作在一个单独的线程,所以循环遍历所有照片,而第一张照片仍然上传
我想上传他们一个,所以循环除非已经上传第一张照片,否则不要迭代到下一张照片

  @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 int photoNumber = x + 1;
dialog.setTitle(上传照片编号:+ 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(上传:+ progress +KBs+ totalBytes +KBs);
}
});
task.addOnSuccessListener(getActivity(),new OnSuccessListener< UploadTask.TaskSnapshot>(){
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot){
dialog.setMessage 上传);
item.setEnabled(true);
Toast.makeText(getActivity(),taskSnapshot.getDownloadUrl()。toString(),Toast.LENGTH_SHORT).show();
}
});
}
dialog.dismiss();
返回true;
默认:
返回super.onOptionsItemSelected(item);



$ div $解析方案

可以给你一个算法(只是回答它的JS):

  //设置
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);
}));
}

//使用它!
firebase.storage().ref()。putFiles(files).then(function(metadatas){
//获取文件元数据
})。catch(function(error ){
//如果任何任务失败,请处理这个
});

您可以使用Android Tasks.whenAll docs blog post )做类似的事情:创建一个任务数组,然后使用 whenAll )将其踢出。


Can anyone help me please.

I have a problem uploading multiple photos with Firebase. My problem is that when I loop through the photos to be uploaded the UploadTask seems to work on a separate thread so the loop iterates through all photos while the first photo still uploads I want to upload them one by one so the loop don't iterate to the next photo unless the first photo have been uploaded

@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);
    }
}

解决方案

I can give you an for the algorithm (just answered it for 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
});

You can use the Android Tasks.whenAll (docs, blog post) to do a similar thing: create an array of tasks, then use a whenAll() to kick them off.

这篇关于使用Firebase上传异步多张照片的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆