मुझे भी इस समस्या का सामना करना पड़ा जब मैं अपने प्रोजेक्ट पर काम कर रहा था। मैं वास्तव में चाहता हूं कि वे एक अंतिम एपी विधि प्रदान करें। वैसे भी, मैंने ऐसा किया है: जब आप फायरबेस स्टोरेज में इमेज अपलोड कर रहे हों, तो एक ऑब्जेक्ट बनाएं और इस ऑब्जेक्ट को उसी समय फायरबेस डेटाबेस में पास करें। इस ऑब्जेक्ट में छवि का डाउनलोड URI शामिल है।
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);
}
});
बाद में जब आप किसी फ़ोल्डर से चित्र डाउनलोड करना चाहते हैं, तो आप बस उस फ़ोल्डर के तहत फ़ाइलों के माध्यम से पुनरावृति करते हैं। इस फ़ोल्डर का फायरबेस स्टोरेज में "फ़ोल्डर" के समान नाम है, लेकिन आप उन्हें नाम दे सकते हैं। मैंने उन्हें अलग धागे में डाल दिया।
@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) {
}
});
अब मेरे पास प्रत्येक छवि के लिए यूआरआई वाली वस्तुओं की एक सूची है, मैं जो कुछ भी करना चाहता हूं वह उनके साथ कर सकता हूं। उन्हें ImageView में लोड करने के लिए, मैंने एक और धागा बनाया।
@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;
}
यह बिटमैप की सूची लौटाता है, जब यह समाप्त होता है तो मैं उन्हें मुख्य गतिविधि में इमेज व्यू में संलग्न करता हूं। नीचे दिए गए तरीके @ ऑवरराइड हैं क्योंकि मेरे पास इंटरफेस हैं और अन्य थ्रेड्स में पूरा होने के लिए सुनते हैं।
@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);
}
}
ध्यान दें कि मुझे सूची चित्र के लिए पहले इंतजार करना होगा और फिर सूची बिटमैप पर काम करने के लिए थ्रेड को कॉल करना होगा। इस स्थिति में, छवि में 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);
}
उम्मीद है कि कोई इसे मददगार मिले। यह भविष्य में भी खुद के लिए एक गिल्ड की तरह काम करेगा।