我想从firebase存储中下载4张图片,并将它们加载到活动中的4个imagebutton中。
我可以在内部存储器中下载该文件,但无法设置活动中包含的imagebutton中的图片,因为我收到错误“arrayindexoutofboundsexception:length=4;指数=4“
我认为问题是在for循环中从firebase异步下载。可能在循环的第一个循环中,它请求第一个文件,但是当下载第一个文件时,for循环不会等待它并不断增加索引i。当文件被下载时,索引i是“outofbounds”。
你认为这就是问题所在吗?
我该怎么解决?提前告诉你。
错误是:
e/androidruntime:致命异常:主进程:com.example.grigliaconscelta,pid:27029 java.lang.arrayindexoutofboundsexception:length=4;指数=4
public class MainActivity extends AppCompatActivity {
//NUMBER OF PICTURES I WANT TO DOWNLOAD
int num_modelli = 4;
//ARRAY WHERE I'LL STORE THE FILES DOWNLOADED
File[] mypath = new File[num_modelli];
int i = 0;
FirebaseStorage storage = FirebaseStorage.getInstance();
//FOLDER THAT CONTAINS IMAGE IN FIREBASE
StorageReference folder = storage.getReference().child("test");
//WILL CONTAIN THE INFO ABOUT "TEST" FOLDER IN FIREBASE STORAGE
ListResult listResult;
Bitmap bitmap;
String nomeFile;
//THE ACTIVITY COMPONENT THAT WILL CONTAINS THE PICTURES DOWNLOADED FROM FIREBASE
ImageButton[] myImageButton = new ImageButton[num_modelli];
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// BINDING OF THE IMAGEBUTTON COMPONENT WITH THE ELEMENT OF ARRAY
myImageButton[0] = findViewById(R.id.imageButton0);
myImageButton[1] = findViewById(R.id.imageButton1);
myImageButton[2] = findViewById(R.id.imageButton2);
myImageButton[3] = findViewById(R.id.imageButton3);
FirebaseApp.initializeApp(this);
ContextWrapper cw = new ContextWrapper(getApplicationContext());
// SET THE DIRECTORY USED TO STORE THE FILE IN INTERNAL STORAGE
final File directory = cw.getDir("imageGrid", Context.MODE_PRIVATE);
//GET INFORMATION FROM THE "TEST" FOLDER IN FIREBASE STORAGE
folder.listAll().addOnSuccessListener(new OnSuccessListener<ListResult>() {
@Override
public void onSuccess(ListResult listResult) {
System.out.println("NUMBER OF FILES : " + listResult.getItems().size());
//LOOP FOR DOWNLOAD EVERY FILE IN THE "TEST" FOLDER AND SET IT IN THE CORRESPONDENT IMAGEBUTTON IN ACTIVITY
for (i = 0; i < num_modelli; i++) {
//READ THE NAME OF FIRST FILE IN TEST FOLDER
nomeFile = listResult.getItems().get(i).getName();
//CREATE THE FILE IN THE INTERNAL STORAGE OF DEVICE
mypath[i] = new File(directory, nomeFile);
//POINT AT THE FILE TO DOWNLOAD
folder = storage.getReference().child("test/" + nomeFile);
//System.out.println("FOLDER PATH " + folder.getPath());
//DOWNLOAD THE FILE POINTED TO FOLDER IN THE FILE INSIDE THE DEVICE REFERENCED IN MYPATH[I]
folder.getFile(mypath[i]).addOnSuccessListener(new OnSuccessListener<FileDownloadTask.TaskSnapshot>() {
@Override
public void onSuccess(FileDownloadTask.TaskSnapshot taskSnapshot) {
System.out.println("FILE CREATED " + directory.getPath());
//DECONDE THE FILE DOWNLOADED AND STORED IN DEVICE
bitmap = BitmapFactory.decodeFile(directory + "/" +mypath[i].getName());
//SET THE IMAGE IN THE COMPONENT OF ACTIVITY
myImageButton[i].setImageBitmap(bitmap);
//REFRESH THE COMPONENT
myImageButton[i].refreshDrawableState();
}
}).addOnFailureListener(new OnFailureListener() {
@Override
public void onFailure(@NonNull Exception e) {
System.out.println("FILE NOT CREATED " + e.toString());
}
});
}
}
});
}
}
1条答案
按热度按时间41zrol4v1#
我想从firebase存储中下载4张图片,并将它们加载到活动中的4个imagebutton中。
我想你会发现毕加索的图书馆很满。您需要从每个storagereference获取其下载url,然后就可以完成所有设置。
这里有一种方法(顺便说一句,我个人认为你需要单独拿着你的图像按钮,而不是在一个数组中,但我并不完全熟悉你想要完成什么):
祝你好运!