从Firebase存储更快下载图像

时间:2018-10-05 21:10:49

标签: android firebase android-recyclerview firebase-storage android-glide

我用于Firebase存储的当前架构结构如下:

  

Photos_folder /
  ->用户ID 01 -> profile_picture_folder / -> 图片/ jpeg(URI)
  ->用户ID 02
  ->用户ID 03
  ->等等...

在我的适配器中,我有一个onBindViewHolder方法,其中传递了URI并通过Firebase存储网络检索uri映像:

@Override
public void onBindViewHolder(@NonNull final CommentViewHolder holder, int position) {
    Uri imageUri = Uri.parse(list.get(position).getImageUri());

    photosStorageReference = FirebaseStorage.getInstance().getReference();
    photosStorageReference.child(Constant.PHOTOS_FIREBASE).child(userId)
            .child(Constant.USER_PROFILE_PICTURE_FOLDER).child(imageUri.getLastPathSegment())
            .getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>() {
        @Override
        public void onSuccess(Uri uri) {
            SimpleTarget target = new SimpleTarget<Bitmap> (200, 200) {
                @Override
                public void onResourceReady(@NonNull Bitmap bitmap, @Nullable Transition<? super Bitmap> transition) {
                    imageView.setImageBitmap(bitmap);
                }
            };
            GlideApp.with(context).asBitmap().load(uri).diskCacheStrategy(DiskCacheStrategy.DATA).apply(
                    RequestOptions.circleCropTransform()).into(target);
        }
    }).addOnFailureListener(new OnFailureListener() {
        @Override
        public void onFailure(@NonNull Exception e) {
            Log.e(TAG, e.getMessage());
        }
    });
}

问题:
一切工作正常,但是onSuccess方法正在主线程中完成工作,并且它是同步的,因此应用程序在每次图像检索之间都在等待。

反正可以更快地从Firebase中获取图像吗?

也许像以更高的参考级别建立与Firebase的连接,例如
gs://appname-b4532.appspot.com/Photos/

打开连接后,要通过子路径遍历用户ID并检索其各自的图像吗?

userId01 / Profile_picture_folder / image_01
userId02 / Profile_picture_folder / image_02
userId03 / Profile_picture_folder / image_03
..ect

1 个答案:

答案 0 :(得分:2)

您在这里使用Firebase的工作实际上都不是同步的,也不会阻塞主线程。 Firebase SDK均未提供阻止方法。只要有Task对象,该工作就会在另一个线程上完成。

此外,Glide可以完全异步工作-它不会阻塞您用来调用它的线程。

您看到的任何延迟都是系统固有的。

相关问题