gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 02:32:08 25 4
gpt4 key购买 nike

我在 Android 应用程序上从 Firebase 存储下载文件时遇到问题。我知道如何下载一张图片并将其显示在 ImageView 上.但是当我需要在单个 Activity 中下载多个图像时,我遇到了问题。
我在 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 文件以给定的 name 作为参数并将其设置为新的 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); Activity 方法onCreate()像这样的方法:

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

总结和主要问题:

我的 Firebase 存储中有两个具有给定名称的对象 [ img1, img2 ]。相同的文件名存储到 List<String>按名称获取文件。 Activity 中onCreate()方法调用 downloadImg(name)每个名称的方法。该方法下载图像并将其设置为新的 ImageView .
我的问题是只有一张图片会被下载并显示两次。我尝试了一些其他方法来从列表中获取名称并下载文件。所以有时 img1 会同时出现在 ImageView 上s,有时 - img2。因为这个方法只出现了 img1 两次。

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

最佳答案

我有类似的问题,localFile var 被覆盖了下载完成并且 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
// ...
}
});
}

关于java - 如何从 Android 上的 Firebase 存储正确下载多个文件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49106779/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com