Я также столкнулся с этой проблемой, когда я работал над моим проектом. Я действительно хочу, чтобы они предоставили метод end api. Во всяком случае, так я это сделал: когда вы загружаете изображение в хранилище Firebase, создайте объект и передайте этот объект в базу данных Firebase одновременно. Этот объект содержит 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);
}
});
Позже, когда вы хотите загружать изображения из папки, вы просто перебираете файлы под этой папкой. Эта папка имеет то же имя, что и «папка» в хранилище Firebase, но вы можете назвать их, как хотите. Я поместил их в отдельный поток.
@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) {
}
});
Теперь у меня есть список объектов, содержащих URI для каждого изображения, я могу делать все, что я хочу с ними делать. Чтобы загрузить их в 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;
}
Это возвращает список Bitmap, когда он заканчивается, я просто присоединяю их к ImageView в основном действии. Ниже методы @Override, потому что у меня есть интерфейсы, созданные и прослушивающие для завершения в других потоках.
@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);
}
Надеюсь, кто-то сочтет это полезным. Он также будет служить линией гильдии для меня и в будущем.
Вы посылаете ему WM_NULL
с SendMessageTimeout()
. Если это время после чего-то похожего на секунду или три, оно не отвечает (хотя, возможно, в конечном итоге, конечно).
Просто для других людей, проходящих мимо: было бы проще использовать IsHungAppWindow .