【问题标题】:java, how to do something until callbackjava,在回调之前如何做某事
【发布时间】:2018-02-03 17:22:26
【问题描述】:

界面如下:

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

我最想做的是,下载几张图片,下载完成后刷新listview

【问题讨论】:

    标签: java android firebase firebase-storage


    【解决方案1】:

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

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

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

    如果您想等待所有图片都插入后再通知适配器,您可以对照nameList.size()检查插入的图片位置

    您可能还想考虑仅使用OnSuccessListener&lt;byte[]&gt; 接口将字节作为BLOB 存储到sqlite 中,而不必是位图对象。在那种情况下,你不需要那个额外的接口

    然而,Android 文档中推荐的图片加载模式通常是使用 Glide

    Getting Image from Firebase Storage using Glide

    【讨论】:

    • 我应该使用 android.widget 或 android.support.v4.widget 下的 CursorAdapter 吗?
    • 可能支持v4,但正如我在底部所说,只需使用Glide来处理缓存图像
    • 我已经阅读了编辑的部分,尽管我存储图像是因为我不想每次打开应用程序时都下载,它可能会占用大量网络流量(?)。如果我想将图片存储在手机中,以便在没有网络的情况下使用应用程序,哪种存储方式更好?
    • 你明白缓存是什么意思吗?你读过 Glide 库文档吗? bumptech.github.io/glide/doc/caching.html#caching-in-glide
    猜你喜欢
    • 2021-10-27
    • 1970-01-01
    • 1970-01-01
    • 2014-04-25
    • 2011-04-20
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多