如何从Android上的Firebase存储中正确下载多个文件?

时间:2018-03-05 09:07:30

标签: java android firebase firebase-storage

我在Android应用程序上从Firebase Storage下载文件时遇到问题。我知道如何下载一个图像并在ImageView上显示它的方法。但是当我需要在单个活动中下载多个图像时,我遇到了问题 我在List<String>中有文件名,例如: [ img1, img2 ]

对于文件下载,我写了一个方法:

private void downloadImg(String name) {
    String path = "images/"+name+".png";
    StorageReference ref = storage.getReference().child(path);
    try {
        final File localFile = File.createTempFile("Images", "png");
        ref.getFile(localFile).addOnSuccessListener(new OnSuccessListener< FileDownloadTask.TaskSnapshot >() {
            @Override
            public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
                Bitmap bitmap = BitmapFactory.decodeFile(localFile.getAbsolutePath());
                if (bitmap != null) {
                    initImages(bitmap);
                }
            }
        }).addOnFailureListener(new OnFailureListener() {
            @Override
            public void onFailure(@NonNull Exception e) {
                Log.e(Tags.IMAGES, e.getMessage());
            }
        });
    } catch(IOException e) {
        Log.e(Tags.IMAGES, e.getMessage());
    }
}  

此方法下载带有名称 .png 文件作为参数,并将其设置为新的ImageView

在ImageView上设置图像的方法:

问题不应该在那里

private void initImages(Bitmap bitmap) {
    int total = imageNames.size();
    int column = 4;
    ImageView image;
    for (int i = 0, c = 0, r = 0; i < total; i++, c++) {
        if (c == column) {
            c = 0;
            r++;
        }
        image = new ImageView(this);
        image.setScaleType(ImageView.ScaleType.CENTER_CROP);
        image.setContentDescription(getString(R.string.addImageDescription));
        image.setBackgroundColor(getResources().getColor(R.color.bHint));
        image.setImageBitmap(bitmap);
        image.setOnClickListener(imageClickListener(bitmap));
        imagesGrid.addView(image, i);
        GridLayout.LayoutParams params = new GridLayout.LayoutParams();
        params.setGravity(Gravity.CENTER);
        params.height = hw_60;
        params.width = hw_60;
        params.setMargins(padding_5, padding_5, padding_5, padding_5);
        params.columnSpec = GridLayout.spec(c);
        params.rowSpec = GridLayout.spec(r);
        image.setLayoutParams(params);
    }
}  

此方法会创建新的ImageView并将已下载的Bitmap设置为它 我在活动downloadImg(name);方法上使用onCreate()方法,如下所示:

for(String name : imageNames) {
    downloadImg(name);
}  

摘要和主要问题:

我的Firebase存储中有两个对象,其名称为 [ img1, img2 ] 。相同的文件名存储到List<String>以便按名称获取文件。在活动onCreate()方法中,为每个名称调用downloadImg(name)方法。该方法下载图像并将其设置为新的ImageView 我的问题是只会下载其中一个图像并显示两次。我已尝试过其他一些方法从列表中获取名称并下载文件。因此有时 img1 会出现在ImageView和有时 - img2 上。对于此方法,仅出现 img1 两次。

p.s。:我已经搜索了这类问题的答案。没有可能的重复。

1 个答案:

答案 0 :(得分:0)

我也有类似的问题,当 下载完成,onSuccess希望使用它。 我最终做了这样的事情

ArrayMap<String, File> localTmpFileArray = new ArrayMap<String, File>();
...
private void populateAvailableImages() {

    populateImageView("firstImpression.jpg", R.id.image_edit_profile_first_impression);
    populateImageView("profileImage1.jpg", R.id.image_profile_1);
    populateImageView("profileImage2.jpg", R.id.image_profile_2);
}
private void populateImageView(final String serverSideImageName, final int
        imageViewResourceId) {

    File imageLocalTmpFile = null;

    try {
        imageLocalTmpFile = File.createTempFile(serverSideImageName, "jpg");
    } catch (IOException e) {
        Log.w("ops", e);
        Toast.makeText(getApplicationContext(), "Could not create local file. Storage " +
                "full??", Toast.LENGTH_LONG).show();
    }

    localTmpFileArray.put(serverSideImageName, imageLocalTmpFile);

    StorageReference storageRef;
    storageRef = FirebaseStorage.getInstance().getReference();
    StorageReference imageRef = storageRef.child("users/" + FauthUtils.getUserId() + "/" +
            serverSideImageName);
    imageRef.getFile(localTmpFileArray.get(serverSideImageName)).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
        @Override
        public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
            ImageView imageView = (ImageView) findViewById(imageViewResourceId);
            imageView.setImageURI(Uri.fromFile(localTmpFileArray.get(serverSideImageName)));
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception exception) {
            // Handle failed download
            // ...
        }
    });
}