滑行未从StorageReference加载图像

时间:2019-05-28 11:02:10

标签: android firebase firebase-storage android-glide

使用Glide 4.9.0(最新)将图像从StorageReference加载到ImageView时遇到问题。

它被粘在PlaceHolder上。 当我尝试放置引用的可下载URL时,它就起作用了。

StorageReference ref = FirebaseStorage.getInstance().getReference().child("myImage")

//It's not working
Glide.with(mContext)
   .load(ref)
   .placeholder(R.drawable.ic_loading_circle)
   .error(R.drawable.ic_loading_circle)
   .into(mImageView);

//It's working
ref.getDownloadUrl().addOnSuccessListener(new OnSuccessListener<Uri>()
{
    @Override
    public void onSuccess(Uri downloadUrl)
    {
        Glide.with(mContext)
            .load(downloadUrl.toString())
            .placeholder(R.drawable.ic_loading_circle)
            .error(R.drawable.ic_loading_circle)
            .into(mImageView);
    }
});

使用try-catch时没有看到任何错误,我已经将Internet权限放入了清单中。可绘制的其他图像也可以工作

注意:我的firebase有2个应用程序使用,第一个应用程序在使用Glide时没有任何问题,但是第二个应用程序遇到了未知的问题。

任何解决方案或替代方案?因为使用getDownloadUrl()。addOnSuccessListener来获取URI太慢了

4 个答案:

答案 0 :(得分:0)

适合您的解决方案是正确的解决方案。我做事的方式也一样。

profileListener = new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
            String imageUrl = dataSnapshot.getValue(String.class);

            if (ProfileFragment.this.getActivity() != null)
                Glide.with(ProfileFragment.this.getActivity())
                        .load(imageUrl)
                        .placeholder(R.drawable.default_image)
                        .circleCrop()
                        .into(photoPhoto);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError databaseError) {

        }
    };

如果您发现这件事变慢,只需在firebase中启用离线持久性即可。

FirebaseDatabase.getInstance().setPersistenceEnabled(true);

在打开应用程序时调用任何FirebaseDatabase实例之前。

Firebase非常有效地管理同步。

注意:-在开发应用程序期间发现随机调用快照时,请尝试清除应用程序的数据或重新安装。

对我来说很好!

答案 1 :(得分:0)

我不认为Glide支持StorageReference是不同的协议,但是您可以使用支持此协议的FirebaseUI,并在幕后使用Glide库。

FirebaseUI

答案 2 :(得分:0)

  

使用FirebaseUI,您可以快速轻松地下载,缓存和   使用我们与Glide的集成显示来自Cloud Storage的图像。

     

首先,将FirebaseUI添加到您的app / build.gradle:

     

依赖项{       //仅FirebaseUI存储       实现'com.firebaseui:firebase-ui-storage:4.3.1'}

然后,您可以将图像直接从存储设备加载到ImageView中:

// Reference to an image file in Cloud Storage
StorageReference storageReference = FirebaseStorage.getInstance().getReference();

// ImageView in your Activity
ImageView imageView = findViewById(R.id.imageView);

// Download directly from StorageReference using Glide
// (See MyAppGlideModule for Loader registration)
GlideApp.with(this /* context */)
        .load(storageReference)
        .into(imageView);

Firebase Documentation for loading image directly via Glide

答案 3 :(得分:0)

以上答案对我不起作用。

在Glide 4.8.0中,这对我有用:

  1. 首先请确保您的应用build.gradle中有以下内容

    implementation 'com.firebaseui:firebase-ui-storage:3.2.2'

    implementation 'com.github.bumptech.glide:glide:4.8.0'

    annotationProcessor 'com.github.bumptech.glide:compiler:4.8.0'

2。然后使用以下代码从存储引用中加载图像

    DrawableCrossFadeFactory factory =
            new DrawableCrossFadeFactory.Builder().setCrossFadeEnabled(true).build();

    RequestOptions options =
            new RequestOptions()
                    .centerCrop()
                    .diskCacheStrategy(DiskCacheStrategy.RESOURCE)
                    .placeholder(R.drawable.your_progress_animation)
                    .error(R.drawable.ic_your_on_error_image);

    // Download directly from StorageReference using Glide
    // (See MyAppGlideModule for Loader registration)
    Glide.with(getAppContext())
            .load(item.reference)
            .transition(withCrossFade(factory))
            .apply(options)
            .into(holder.signatureImageView);