【问题标题】:Glide not Loading image from StorageReferenceGlide 不从 StorageReference 加载图像
【发布时间】:2019-10-13 21:31:44
【问题描述】:

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

它卡在 PlaceHolder 上.. 当我尝试放置我的参考的可下载网址时,它正在工作..

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 没有看到任何错误,我已经在 Manifest 中设置了 Internet 权限。来自drawable的其他图像也在工作

注意:我的 firebase 被 2 个应用程序使用,第一个应用程序在 Glide 上没有任何问题,但第二个应用程序出现未知问题。

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

【问题讨论】:

  • "Glide 的任何替代方案?"在 Stack Overflow 上寻求技术推荐是题外话。但如果你把这个问题放在你最喜欢的搜索引擎中,你会发现很多选择。也就是说:调用getDownloadUrl() 的需要是一个Firebase API,与Glide 无关,所以大多数其他库也需要这一步
  • 在 Glide 发挥神奇作用之前,您还需要做一件事。装载机注册。 See snippetRead it here

标签: android firebase firebase-storage android-glide


【解决方案1】:

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

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 非常有效地管理同步。

注意:- 每当您在开发应用程序时发现任何随机异常调用快照,请尝试清除应用程序的数据或重新安装。

对我来说很好用!

【讨论】:

    【解决方案2】:

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

    FirebaseUI

    【讨论】:

      【解决方案3】:

      上面的答案对我不起作用。

      在 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);
      

      【讨论】:

        【解决方案4】:

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

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

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

        然后你可以直接从 Storage 中加载图片到 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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2017-09-04
          • 2021-05-30
          • 1970-01-01
          • 2016-03-30
          相关资源
          最近更新 更多