J'ai également rencontré ce problème lorsque je travaillais sur mon projet. Je souhaite vraiment qu'ils fournissent une méthode d'api de fin. Quoi qu'il en soit, voici comment j'ai procédé : Lorsque vous téléchargez une image vers le stockage Firebase, créez un objet et passez cet objet à la base de données Firebase en même temps. Cet objet contient l'URI de téléchargement de l'image.
trailsRef.putFile(file).addOnSuccessListener(new OnSuccessListener<UploadTask.TaskSnapshot>() {
@Override
public void onSuccess(UploadTask.TaskSnapshot taskSnapshot) {
Uri downloadUri = taskSnapshot.getDownloadUrl();
DatabaseReference myRef = database.getReference().child("trails").child(trail.getUnique_id()).push();
Image img = new Image(trail.getUnique_id(), downloadUri.toString());
myRef.setValue(img);
}
});
Plus tard, lorsque vous voudrez télécharger des images d'un dossier, il vous suffira d'itérer parmi les fichiers de ce dossier. Ce dossier a le même nom que le "dossier" dans le stockage Firebase, mais vous pouvez les nommer comme vous le souhaitez. Je les ai mis dans un fil séparé.
@Override
protected List<Image> doInBackground(Trail... params) {
String trialId = params[0].getUnique_id();
mDatabase = FirebaseDatabase.getInstance().getReference();
mDatabase.child("trails").child(trialId).addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
images = new ArrayList<>();
Iterator<DataSnapshot> iter = dataSnapshot.getChildren().iterator();
while (iter.hasNext()) {
Image img = iter.next().getValue(Image.class);
images.add(img);
}
isFinished = true;
}
@Override
public void onCancelled(DatabaseError databaseError) {
}
});
Maintenant que j'ai une liste d'objets contenant les URI de chaque image, je peux faire ce que je veux avec eux. Pour les charger dans imageView, j'ai créé un autre thread.
@Override
protected List<Bitmap> doInBackground(List<Image>... params) {
List<Bitmap> bitmaps = new ArrayList<>();
for (int i = 0; i < params[0].size(); i++) {
try {
URL url = new URL(params[0].get(i).getImgUrl());
Bitmap bmp = BitmapFactory.decodeStream(url.openConnection().getInputStream());
bitmaps.add(bmp);
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return bitmaps;
}
Cela renvoie une liste de Bitmap, quand cela se termine, je les attache simplement à ImageView dans l'activité principale. Les méthodes ci-dessous sont @Override car j'ai créé des interfaces et j'écoute l'achèvement dans d'autres threads.
@Override
public void processFinishForBitmap(List<Bitmap> bitmaps) {
List<ImageView> imageViews = new ArrayList<>();
View v;
for (int i = 0; i < bitmaps.size(); i++) {
v = mInflater.inflate(R.layout.gallery_item, mGallery, false);
imageViews.add((ImageView) v.findViewById(R.id.id_index_gallery_item_image));
imageViews.get(i).setImageBitmap(bitmaps.get(i));
mGallery.addView(v);
}
}
Notez que je dois d'abord attendre que List Image soit renvoyée, puis appeler le thread pour travailler sur List Bitmap. Dans ce cas, l'image contient l'URI.
@Override
public void processFinish(List<Image> results) {
Log.e(TAG, "get back " + results.size());
LoadImageFromUrlTask loadImageFromUrlTask = new LoadImageFromUrlTask();
loadImageFromUrlTask.delegate = this;
loadImageFromUrlTask.execute(results);
}
J'espère que quelqu'un le trouvera utile. Il servira également de ligne de guilde pour moi-même à l'avenir.
0 votes
Pouvez-vous afficher un code complet de la solution ?