Tôi cũng gặp phải vấn đề này khi tôi đang thực hiện dự án của mình. Tôi thực sự ước họ cung cấp một phương pháp api kết thúc. Dù sao, đây là cách tôi đã làm: Khi bạn đang tải một hình ảnh lên bộ nhớ Firebase, hãy tạo một Đối tượng và chuyển đối tượng này vào cơ sở dữ liệu Firebase cùng một lúc. Đối tượng này chứa URI tải xuống của hình ảnh.
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);
}
});
Sau đó, khi bạn muốn tải xuống hình ảnh từ một thư mục, bạn chỉ cần lặp qua các tệp trong thư mục đó. Thư mục này có cùng tên với "thư mục" trong bộ nhớ Firebase, nhưng bạn có thể đặt tên chúng theo cách bạn muốn. Tôi đặt chúng trong chủ đề riêng biệt.
@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) {
}
});
Bây giờ tôi có một danh sách các đối tượng chứa URI cho mỗi hình ảnh, tôi có thể làm bất cứ điều gì tôi muốn làm với chúng. Để tải chúng vào imageView, tôi đã tạo một chuỗi khác.
@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;
}
Thao tác này trả về một danh sách Bitmap, khi nó kết thúc, tôi chỉ cần đính kèm chúng vào ImageView trong hoạt động chính. Các phương thức bên dưới là @Override vì tôi đã tạo các giao diện và lắng nghe để hoàn thành trong các luồng khác.
@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);
}
}
Lưu ý rằng tôi phải đợi Hình ảnh danh sách được trả về trước rồi gọi luồng hoạt động trên Bản đồ bit danh sách. Trong trường hợp này, Hình ảnh chứa 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);
}
Hy vọng rằng ai đó thấy nó hữu ích. Nó cũng sẽ hoạt động như một đường dây của guild cho tôi trong tương lai.