java,在回调之前该怎么做

问题描述 投票:2回答:1

这是界面:

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。但似乎线程在图像下载完成之前仍在继续?我该怎么办呢?也许我误解了我学到的东西?

我真正想做的是,下载几张图片,完成下载完成后,刷新列表视图

java android firebase firebase-storage
1个回答
1
投票

首先,我希望您使用CursorAdapter作为列表视图,而不是将数据从sqlite,arraylist,ArrayAdapter等中提取。

其次,理想情况下,您不应将listview图像存储为数据库的一部分。您可以存储firebase链接,然后在适配器中,您将请求图像内容(使用图像加载库,如Glide,见下文)

在任何情况下,您需要做的是在插入图像后通知适配器dataSetChanged每次调用onCallBack,然后列表将在图像处于sqlite后更新。

如果要在通知适配器之前等待插入所有图像,可以检查插入的图像位置对nameList.size()

您可能还想考虑使用OnSuccessListener<byte[]>接口将字节作为BLOB存储到sqlite中,而不一定是Bitmap对象。在这种情况下,您不需要额外的接口

但是,Android文档中用于图像加载的鼓励模式通常是使用Glide

Getting Image from Firebase Storage using Glide

© www.soinside.com 2019 - 2024. All rights reserved.