我用于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
答案 0 :(得分:2)
您在这里使用Firebase的工作实际上都不是同步的,也不会阻塞主线程。 Firebase SDK均未提供阻止方法。只要有Task对象,该工作就会在另一个线程上完成。
此外,Glide可以完全异步工作-它不会阻塞您用来调用它的线程。
您看到的任何延迟都是系统固有的。