Android 如何按arraylist中的顺序将多个文件上载到firebase数据库?
我正在尝试向firebase添加多个图像,但它似乎没有按顺序上传。我相信myUrlList的添加取决于上传到服务器的顺序。是否有任何方法可以将myUrlsList与imageUrlList排序相同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()
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()启动它。。一旦上传了一个图像,该方法将检查是否还有更多的工作要做,如果是这样的话,它会重新调用自己。如果你想