这是界面:
public interface BitmapCallBackInterface {
void onCallBack(Bitmap bitmap);
}
这是方法并调用它:
public void downloadImagesFromFireStorage(String imgName, final BitmapCallBackInterface bitmapCallBackInterface) {
StorageReference storageRef = FirebaseStorage.getInstance()
.getReferenceFromUrl("gs://fake-mc-app.appspot.com").child("imgs").child(imgName + ".png");
final long ONE_MEGABYTE = 1024 * 1024;
storageRef.getBytes(ONE_MEGABYTE).addOnSuccessListener(new OnSuccessListener<byte[]>() {
@Override
public void onSuccess(byte[] bytes) {
Bitmap bitmap = BitmapFactory.decodeByteArray(bytes, 0, bytes.length);
bitmapCallBackInterface.onCallBack(bitmap);
}
});
}
叫它:
for (i = 0; i < nameList.size(); i++) {
String couponName = nameList.get(i);
storageHandler.downloadImagesFromFireStorage(imgName, new BitmapCallBackInterface() {
@Override
public void onCallBack(Bitmap bitmap) {
insertImg(couponName, bitmap); // store image into SQLite
}
});
}
getDataFromSQLite();
// and then display Bitmaps to the a list of ImageView
有人告诉我线程将在接收回调后继续,所以我写了一个for循环来从firebase-storage下载所有图像,将它们全部存储到SQlite数据库中,然后检索它们并显示给ImageView。但似乎线程在图像下载完成之前仍在继续?我该怎么办呢?也许我误解了我学到的东西?
我真正想做的是,下载几张图片,完成下载完成后,刷新列表视图
首先,我希望您使用CursorAdapter作为列表视图,而不是将数据从sqlite,arraylist,ArrayAdapter等中提取。
其次,理想情况下,您不应将listview图像存储为数据库的一部分。您可以存储firebase链接,然后在适配器中,您将请求图像内容(使用图像加载库,如Glide,见下文)
在任何情况下,您需要做的是在插入图像后通知适配器dataSetChanged每次调用onCallBack,然后列表将在图像处于sqlite后更新。
如果要在通知适配器之前等待插入所有图像,可以检查插入的图像位置对nameList.size()
您可能还想考虑使用OnSuccessListener<byte[]>
接口将字节作为BLOB存储到sqlite中,而不一定是Bitmap对象。在这种情况下,您不需要额外的接口
但是,Android文档中用于图像加载的鼓励模式通常是使用Glide