Android 如何按arraylist中的顺序将多个文件上载到firebase数据库?

Android 如何按arraylist中的顺序将多个文件上载到firebase数据库?,android,firebase,firebase-realtime-database,firebase-storage,Android,Firebase,Firebase Realtime Database,Firebase Storage,我正在尝试向firebase添加多个图像,但它似乎没有按顺序上传。我相信myUrlList的添加取决于上传到服务器的顺序。是否有任何方法可以将myUrlsList与imageUrlList排序相同 for(int i=0; i< imageUriList.size(); i++){ final StorageReference filereference = storageReference.child(System.currentTimeMillis()

我正在尝试向firebase添加多个图像,但它似乎没有按顺序上传。我相信myUrlList的添加取决于上传到服务器的顺序。是否有任何方法可以将myUrlsList与imageUrlList排序相同

    for(int i=0; i< imageUriList.size(); i++){
            final StorageReference filereference = storageReference.child(System.currentTimeMillis()
                    + "." + getFileExtension(imageUriList.get(i)));

            uploadTask = filereference.putFile(imageUriList.get(i));
            uploadTask.continueWithTask(new Continuation() {
                @Override
                public Object then(@NonNull Task task) throws Exception {
                    if(!task.isSuccessful()){
                        throw task.getException();
                    }

                    return filereference.getDownloadUrl();
                }
            }).addOnCompleteListener(new OnCompleteListener<Uri>() {
                @Override
                public void onComplete(@NonNull Task<Uri> task) {
                    if(task.isSuccessful()){

                        Uri downloadUri = task.getResult();
                        myUrl = downloadUri.toString();
                        myUrlList.add(myUrl);
for(int i=0;i
从arraylist获取名称创建新处理程序并执行runnable,现在每次上载时执行它为不同的文件创建新runnable,然后根据需要上载文件。

从arraylist获取名称创建新处理程序并执行runnable,现在每次上载时执行它为不同的文件创建新runnable然后根据您的要求上传文件。

即使您使用循环,理论上,图像的上传也应该按照迭代的顺序进行,您无法知道实际将每个图像分别上传到Firebase存储需要多少时间。正如@DougStevenson在其评论中提到的,您正在以“并行”。因此,较小尺寸的图像可以比较大尺寸的图像上传快得多,即使较小的图像正好位于较大图像之后,因为上传所需的时间也会更短

解决此问题的解决方案是等待图像上载完成,然后在上一个图像上载完成后立即开始下一次上载。这通常通过递归完成,方法调用自身

private void uploadImageToFirebaseStorage() {
    if (imageUriList.size() > 0) {
        Uri imageUri = imageUriList.get(0);
        StorageReference filereference = storageReference.child(System.currentTimeMillis()
                + "." + getFileExtension(imageUri));
        imageUriList.remove(0);
        uploadTask = filereference.putFile(imageUri);
        uploadTask.continueWithTask(new Continuation() {
            @Override
            public Object then(@NonNull Task task) throws Exception {
                if(!task.isSuccessful()){
                    throw task.getException();
                }

                return filereference.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if (task.isSuccessful()) {
                    Uri downloadUri = task.getResult();
                    myUrl = downloadUri.toString();
                    myUrlList.add(myUrl);
                    uploadBeerImageToFirebaseStorage(); //Call when completes
                }
            }
        });
    }
}
private void上传ImageToFireBaseStorage(){
如果(imageUriList.size()>0){
Uri imageUri=imageUriList.get(0);
StorageReference filereference=StorageReference.child(System.currentTimeMillis()
+“+getFileExtension(imageUri));
imageUriList.remove(0);
uploadTask=filereference.putFile(imageUri);
uploadTask.continueWithTask(新的Continuation(){
@凌驾
然后公共对象(@NonNull任务)引发异常{
如果(!task.issusccessful()){
抛出task.getException();
}
返回filereference.getDownloadUrl();
}
}).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Uri downloadUri=task.getResult();
myUrl=downloadUri.toString();
添加(myUrl);
uploadBeerImageToFirebaseStorage();//完成时调用
}
}
});
}
}

首先,使用uploadImageToFirebaseStorage()启动它。上传图像后,该方法将检查是否还有更多工作要做,如果是这样,则会重新调用自身。

即使使用循环,理论上,图像的上传应该按照迭代的顺序进行,您也无法知道实际将每个图像上传到Firebase Stor需要多少时间年龄分开。正如@DougStevenson在他的评论中提到的,你正在“并行”上传所有内容。因此,较小尺寸的图像可以比较大尺寸的图像上传快得多,即使较小的图像正好位于较大图像之后,因为上传所需的时间也会更短

解决此问题的解决方案是等待图像上载完成,然后在上一个图像上载完成后立即开始下一次上载。这通常通过递归完成,方法调用自身

private void uploadImageToFirebaseStorage() {
    if (imageUriList.size() > 0) {
        Uri imageUri = imageUriList.get(0);
        StorageReference filereference = storageReference.child(System.currentTimeMillis()
                + "." + getFileExtension(imageUri));
        imageUriList.remove(0);
        uploadTask = filereference.putFile(imageUri);
        uploadTask.continueWithTask(new Continuation() {
            @Override
            public Object then(@NonNull Task task) throws Exception {
                if(!task.isSuccessful()){
                    throw task.getException();
                }

                return filereference.getDownloadUrl();
            }
        }).addOnCompleteListener(new OnCompleteListener<Uri>() {
            @Override
            public void onComplete(@NonNull Task<Uri> task) {
                if (task.isSuccessful()) {
                    Uri downloadUri = task.getResult();
                    myUrl = downloadUri.toString();
                    myUrlList.add(myUrl);
                    uploadBeerImageToFirebaseStorage(); //Call when completes
                }
            }
        });
    }
}
private void上传ImageToFireBaseStorage(){
如果(imageUriList.size()>0){
Uri imageUri=imageUriList.get(0);
StorageReference filereference=StorageReference.child(System.currentTimeMillis()
+“+getFileExtension(imageUri));
imageUriList.remove(0);
uploadTask=filereference.putFile(imageUri);
uploadTask.continueWithTask(新的Continuation(){
@凌驾
然后公共对象(@NonNull任务)引发异常{
如果(!task.issusccessful()){
抛出task.getException();
}
返回filereference.getDownloadUrl();
}
}).addOnCompleteListener(新的OnCompleteListener(){
@凌驾
未完成的公共void(@NonNull任务){
if(task.issusccessful()){
Uri downloadUri=task.getResult();
myUrl=downloadUri.toString();
添加(myUrl);
uploadBeerImageToFirebaseStorage();//完成时调用
}
}
});
}
}
首先,用uploadImageToFirebaseStorage()启动它。。一旦上传了一个图像,该方法将检查是否还有更多的工作要做,如果是这样的话,它会重新调用自己。

如果你想