【问题标题】:Cannot download photo from Firebase - blank ImageView无法从 Firebase 下载照片 - 空白 ImageView
【发布时间】:2019-04-16 20:20:31
【问题描述】:

我有 GridView 适配器,我想通过照片的 URL 从 Firebase 存储下载照片。

当我将 URL 传递给 GridViewAdapter 时,照片是空白的。有空间,但没有图片。像透明图片一样。

如果我传递在 Google 中找到的图像 URL,它可以工作,但它不适用于 Firebase 存储的 URL。怎么了?

这就是我尝试从 Firebase 存储获取 URL 的方式 我正在获取包含所有 URL 的节点的 DataSnapshot

databaseReference.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot dataSnapshot) {

                photos.clear();
                for(DataSnapshot ds: dataSnapshot.getChildren()){
                    String photoURL = ds.getValue(String.class);
                    try {
                        photos.add(photoURL);


                    }catch (NullPointerException e) {
                    }
                }
                gridViewAdapter = new GridViewAdapter(getContext(), photos);
                gridView.setAdapter(gridViewAdapter);

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

我的 GridViewAdapter.class,getView 方法

@Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View gridView = convertView;

        if(convertView == null){

            inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

            gridView = inflater.inflate(R.layout.image_item,null);

        }

        ImageView imageView = gridView.findViewById(R.id.image_from_photo_album);

        Picasso.with(context).load(photos.get(position)).into(imageView);

        return imageView;
    }

不带 Firebase 存储 URL 的 ScreenView:

带有 Firebase 存储 URL 的 ScreenView:

【问题讨论】:

  • 你调试了 url 吗?而不是尝试在 i 中查看。浏览器是否正确?
  • 是的,我做到了。它已正确保存在我的 Firebase 数据库中。如果我直接从 Firebase 数据库中的图像目录复制 URL 并将其粘贴到 Picasso,它会给我相同的结果。
  • 我推荐你把 Picasso 改成 Glide ))) Picasso 库有很多问题,Glide 很快解决了。可能毕加索的缓存有问题,或者下载出错。

标签: java android firebase


【解决方案1】:

尝试将Picasso.with(context).load(photos.get(position)).into(imageView) 更改为: String url = photos.get(position); Picasso.with(context).load(url).into(imageView)

另外:也许您来自 Firebase 的照片 url 始终为 Null,您是否调试过它?

【讨论】:

  • 我试过了。它没有像我想象的那样改变。网址没问题。如果我将相同的 URL 粘贴到网络浏览器中,如果我将其粘贴到我的代码中,它就不会起作用。
【解决方案2】:

这是非常广泛的。当您将 url “传递”到您的 GridViewAdapter 时,您如何加载图像?也许上传您的代码,以便我们为您提供帮助。

【讨论】:

  • 已上传。我通过 Picasso 传递 URL。
  • 首先,我会确保您的照片获得网址。在 String photoURL = ds.getValue(String.class); 上抛出一个断点
  • 它正在获取 url。我在 Firebase 实时数据库和 ToastMessage 中看到了它。如果我将 URL 直接从 Firebase 存储粘贴到 Firebase 数据库中,它是相同的,如果我将它粘贴到 Picasso 路径中,它也是相同的。空白图片。
  • 我不完全确定问题出在哪里。如果你有 url 并传递给适配器。我要说的一件事是你为什么要在 datachange() 上初始化你的 gridview 适配器?把它放在你的 onCreate 中,然后调用 gridviewadapter.notifydatasetchanged
  • 那是你的问题。调用 gridViewAdapter.notifydatasetchanged();
【解决方案3】:

如果你的 URL 正确,ImageView 可以正确渲染另一张图片,那么似乎 Picasso 产生了一些可能的问题:

  • 缓存或下载程序有问题。看到这个话题How do I use disk caching in Picasso?也许对你有帮助。
  • 您的 URL 下载完成时出错。尝试向毕加索链添加错误处理
Picasso.with(context)
    .load(photos.get(position))
    .error(R.drawable.error_image)
    .placeholder(R.mipmap.ic_launcher)
    .into(imageView);

更多详情here

【讨论】:

    【解决方案4】:

    问题是,我在负责显示图像的 ImageView 中的 layout_width 和 layout_height 上设置了 wrap_content 属性。之前这张图片的高度非常非常大(我不知道为什么)并且它导致了问题。

    注意:来自 Google 的分辨率为 800x450 的图像 url 的 GridView 可以完美运行,问题仅在于 Firebase 存储中的照片。

    问题已部分解决,因为如果我设置固定大小的图像,它会显示图像但我仍然有一些问题......例如 GridView 有时会将两个图像分层在同一位置,或者 GridView 的第一个元素是'不加载。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多