【问题标题】:Download all files from firebase storage从 Firebase 存储下载所有文件
【发布时间】:2019-12-10 01:28:07
【问题描述】:

我正在尝试从我的 Firebase 存储中下载所有图像。我计划通过将每个图像的 storageReference 放到一个列表中来做到这一点,然后遍历该列表并创建一个 downloadTasks 集合(每个图像一个任务)。之后,我想使用 Tasks.whenAll() 一次下载所有内容。 问题是我无法将 downloadTasks 添加到集合中。

我的测试代码如下所示:

package com.example.testdownload;

import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.appcompat.app.AppCompatActivity;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.os.Bundle;
import android.widget.ImageView;

import com.google.android.gms.tasks.OnFailureListener;
import com.google.android.gms.tasks.OnSuccessListener;
import com.google.android.gms.tasks.Task;
import com.google.android.gms.tasks.Tasks;
import com.google.firebase.storage.FileDownloadTask;
import com.google.firebase.storage.FirebaseStorage;
import com.google.firebase.storage.ListResult;
import com.google.firebase.storage.StorageReference;

import java.io.File;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Iterator;

public class MainActivity extends AppCompatActivity {


    ImageView imageView;

    ArrayList<StorageReference> firebaseImagesUrls;
    ArrayList<Bitmap> images;

    Collection<Task<FileDownloadTask>> loadTasks;

    Bitmap bitmap;

    FirebaseStorage firebaseStorage = FirebaseStorage.getInstance();
    StorageReference storageReference = firebaseStorage.getReferenceFromUrl("gs://ehotel-3a76c.appspot.com");

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        imageView = (ImageView)findViewById(R.id.imageView);

        images = new ArrayList<>();
        firebaseImagesUrls = new ArrayList<>();

        loadTasks = new Collection<Task<FileDownloadTask>>() {
            @Override
            public int size() {
                return 0;
            }

            @Override
            public boolean isEmpty() {
                return false;
            }

            @Override
            public boolean contains(@Nullable Object o) {
                return false;
            }

            @NonNull
            @Override
            public Iterator<Task<FileDownloadTask>> iterator() {
                return null;
            }

            @NonNull
            @Override
            public Object[] toArray() {
                return new Object[0];
            }

            @NonNull
            @Override
            public <T> T[] toArray(@NonNull T[] ts) {
                return null;
            }

            @Override
            public boolean add(Task<FileDownloadTask> fileDownloadTaskTask) {
                return false;
            }

            @Override
            public boolean remove(@Nullable Object o) {
                return false;
            }

            @Override
            public boolean containsAll(@NonNull Collection<?> collection) {
                return false;
            }

            @Override
            public boolean addAll(@NonNull Collection<? extends Task<FileDownloadTask>> collection) {
                return false;
            }

            @Override
            public boolean removeAll(@NonNull Collection<?> collection) {
                return false;
            }

            @Override
            public boolean retainAll(@NonNull Collection<?> collection) {
                return false;
            }

            @Override
            public void clear() {

            }
        };

        storageReference.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
            @Override
            public void onSuccess(ListResult listResult) {
                for (StorageReference item : listResult.getItems()){
                    //Add code to save images here
                    firebaseImagesUrls.add(item);
                }

                for(StorageReference imgRef : firebaseImagesUrls)
                {
                    try{
                        final File theImage = File.createTempFile("img", "png");

                        Task task = imgRef.getFile(theImage);
                        task.addOnSuccessListener(new OnSuccessListener() {
                            @Override
                            public void onSuccess(Object o) {
                                bitmap = BitmapFactory.decodeFile(theImage.getAbsolutePath());
                                images.add(bitmap);
                            }
                        });
                        //THE PROBLEM IS RIGHT UNDER: loadTasks is always empty.
                        loadTasks.add(task);
                    }
                    catch(IOException e)
                    {
                        e.printStackTrace();
                    }

                }
                Task allLoads = Tasks.whenAll(loadTasks);
                allLoads.addOnSuccessListener(new OnSuccessListener() {
                    @Override
                    public void onSuccess(Object o) {
                        //Do smth with loaded images
                    }
                });
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                System.out.println("ListAll() failed.");
            }
        });
    }
}


【问题讨论】:

    标签: java android firebase firebase-storage


    【解决方案1】:

    显然是因为没有定义数据结构来存储 Task 对象。 loadTask.add(task) 并没有真正做任何有意义的事情,而是返回一个布尔值。因此,这只是一个没有真正实现的泛型类。

    @Override
    public boolean add(Task<FileDownloadTask> fileDownloadTaskTask) {
       return false;
    }
    

    在这里,您应该在合适的数据结构中定义 Task 对象的存储。我真的不明白你为什么不使用 Java 中已经存在的定义明确的集合。像 ArrayListLinkedList 等。

    【讨论】:

    • 如果有帮助很高兴。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-01
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-20
    相关资源
    最近更新 更多