毕加索无法加载一些URL的图片(没有特殊字符)

4
我会尽力帮助您进行翻译。以下是需要翻译的内容:

我正在使用Picasso从互联网加载一些图片到listView中。问题是,虽然有些图片成功加载,但有些却突然消失了。

成功(品牌图像成功显示):

enter image description here

失败(未显示品牌形象,失败):

enter image description here

当ImageView失败时,它会消失。这是我的代码:
Picasso.with(mContext)
.load(UrlEncoder.encode(interiorDesign.getBrand_image_url()))
.config(Bitmap.Config.RGB_565)
.error(R.drawable.blank)
.fit()
.centerInside()
.into(holder.brand);

这是我的 .xml 文件:

<LinearLayout
android:layout_width="match_parent"
        android:layout_height="90dp"
        android:paddingLeft="10dp"
        android:paddingRight="10dp"
        android:layout_alignParentLeft="true"
        android:gravity="center_vertical"
        android:orientation="horizontal">

<RelativeLayout
android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:paddingRight="10dp">
...
</RelativeLayout>

<ImageView
android:layout_width="200dp"
        android:layout_height="90dp"
        android:paddingBottom="10dp"
        android:id="@+id/partial_interior_design_brand" />
</LinearLayout>

我已经检查过,它失败是因为它在Picasso的error()方法中捕获了一个错误。 这里是失败的链接。 这里是另一个失败的链接。 这里是一个成功的链接。
这个问题发生了几次。我怀疑问题出在fit()和centerInside()方法上,因为当我删除这两个方法后,问题就解决了。但是没有这两个方法,我的图片就无法适应大小。

只需使用以下代码:Picasso.with(mContext).load(interiorDesign.getBrand_image_url()).config(Bitmap.Config.RGB_565) .error(R.drawable.blank) .fit() .centerInside() .into(holder.brand); - Kevin Crain
2
我测试了一下,但不起作用。后来我换成了 Universal Image Loader ,最终问题得以解决。我不知道 Picasso 出了什么问题。我经常遇到这种问题。 - Derekyy
@Derekyy,你能提供一下那张无法显示的图片的URL吗? - Faisal Shaikh
@FaisalShaikh 这两个链接无效:http://luxproperty.kaytami.com/platform/media/image/jpeg/2015/02/Ozure_profile_revised.jpghttp://luxproperty.kaytami.com/platform/media/image/png/2015/02/PureAW_profile.png - Derekyy
@Derekyy 我已经在我的应用程序中测试了你提供的两个URL,并使用Picaso加载了图片。一切都完全正常运行。 - Faisal Shaikh
显示剩余2条评论
5个回答

4

嘿,试着将您的URL连接到"http://"。由于某种原因,Picasa不会在没有http://的情况下加载图像。所以请尝试下一个方法。

Picasso.with(mContext)
.load("http://".concatenate(url))
.config(Bitmap.Config.RGB_565)
.error(R.drawable.blank)
.fit()
.centerInside()
.into(holder.brand);

0
我是这样使用 Picasso 的,它总是能够加载我的图片:
if (imageURL != null) {
    Picasso.with(getContext()).load(imageURL).error(R.drawable.ic_missing)
    .into(ivThumbnail);

我的布局:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@drawable/itemview_campaign_background"
    android:orientation="vertical"
    android:paddingBottom="5dp"
    android:paddingLeft="10dp"
    android:paddingRight="10dp" >

    <ImageView
        android:id="@+id/ivThumbnail"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

... // More stuff

0
除了切换到 Universal Image Loader,我找到了另一种解决方案,即使用 Picasso 中的 Transform() 方法,并将位图的 targetHeight 指定为 ImageView 的高度。由于 CenterInside 只是意味着位图必须完全位于 imageView 内部,因此我还检查了目标宽度(缩放后)是否大于 imageView 的宽度。如果是,则使用 targetWidth 作为参考点而不是 targetHeight。
            Picasso.with(mContext)
                    .load(url)
                    .transform(new Transformation() {
                        @Override
                        public Bitmap transform(Bitmap source) {
                            int targetHeight = dpToPx(height_dp);
                            double aspectRatio = (double) source.getHeight() / (double) source.getWidth();
                            int targetWidth = (int) (targetHeight / aspectRatio);
                            if (targetWidth > dpToPx(width_dp)) {
                                targetWidth = dpToPx(width_dp);
                                targetHeight = (int) (targetWidth * aspectRatio);
                            }
                            Bitmap result = Bitmap.createScaledBitmap(source, targetWidth, targetHeight, false);
                            if (result != source) {
                                // Same bitmap is returned if sizes are the same
                                source.recycle();
                            }
                            return result;
                        }

                        @Override
                        public String key() {
                            return "transformation" + " desiredWidth";
                        }
                    })
                    .into(imageView);

private int dpToPx(int dp) {
    float density = Resources.getSystem().getDisplayMetrics().density;
    return Math.round((float) dp * density);
}

编辑: 经过测试,我发现这种方法在某些情况下不起作用。仍在寻找解决方案。


0

0

不需要使用UrlEncoder

.load(interiorDesign.getBrand_image_url())

只需URL字符串即可

.load(interiorDesign.getBrand_image_url())

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接