java,在回调之前该怎么做

时间:2018-02-03 17:22:26

标签: java android firebase firebase-storage

这是界面:

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

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

Getting Image from Firebase Storage using Glide