安卓 Picasso 图片无法加载

18

我加载图片有两种情况,第一种是直接从互联网加载,第二种是加载在设备中下载的图片。每次加载时,有8-9张图片可以显示,1-2张无法显示。我看到decode返回了false,尽力通过Google搜索,但没有找到解决方法。

  1. WAIT_FOR_CONCURRENT_GC阻塞了22ms
  2. WAIT_FOR_CONCURRENT_GC阻塞了20ms
  3. GC_FOR_ALLOC释放了718K,31%可用空间9948K/14256K,暂停了49ms,总计51ms
  4. D / skia:--- decoder-> decode返回falseGC_CONCURRENT释放了1370K,30%可用空间10081K/14256K,暂停了3ms+ 2ms,总计33ms
  5. GC_FOR_ALLOC释放了916K,30%可用空间10029K/14256K,暂停了66ms,总计67ms

这是我使用Picasso加载的代码:

        Picasso.with(activity)
            .load(path)
            .placeholder(R.drawable.thumbnail_placeholder)
            .resize(width,height)
            .into(imageView);
有什么想法来解决这个问题吗?我每次在加载图片到屏幕上时都调用fit()/resize()。非常感谢您的帮助,提前感谢!
顺便说一下,我在两台机器上进行了测试:模拟器和真实设备Samsung Galaxy Tab 3,并且模拟器上没有任何问题,但实际设备上出现了问题。
更新:
问题是由于图像的颜色空间引起的,其中那些未显示的图像就是YMCK颜色空间中的图像。

1
我怀疑这是内存问题,你能否尝试使用较小的图像进行测试? - Jasper van de Klundert
也许图片的URL在你所在的国家被屏蔽了。 - Ayub
18个回答

40

您可以使用Picasso.with(Context).setLoggingEnabled(true)打开 Picasso 的日志记录。您可能会看到一个带有原因的错误消息。

同时,值得记录您使用的URL并在浏览器中尝试它,以防万一。


有趣,我一定会试试看。谢谢你的时间! - xosuma
15
我认为这已经改为Picasso.get().setLoggingEnabled(true) - MikeL

28

在清单文件中检查互联网权限

<uses-permission android:name="android.permission.INTERNET"/>

1
哦,那是个简单的答案。 - Dita Aji Pratama

15

尝试将您Url开头的"http:"替换为"https:"(如果适用)

(on your String representation of Url).replace("http:", "https:");

对我来说可以。


10

在 Picasso 中,你应该在 .load() 方法中传入 URL 来从互联网加载图片,或者传入 File 类型的对象来从设备存储加载图片。

因此,如果图片存储在设备上,请按以下方式加载:

        Picasso.with(activity)
                .load(new File(path))
                .placeholder(R.drawable.thumbnail_placeholder)
                .resize(width,height)
                .into(imageView);

使用以下代码从互联网加载图片:

        Picasso.with(activity)
                .load(path)
                .placeholder(R.drawable.thumbnail_placeholder)
                .resize(width,height)
                .into(imageView);

这篇文章帮助我从存储中加载图像。谢谢! - Sam
你知道如何在不指定宽度和高度的情况下进行中心裁剪吗?Glide可以自动完成,但是Picasso需要您提供该值。 - TheRealChx101

8
您可以使用Picasso.with(Context).setLoggingEnabled(true)来启用调试以便排除确切的原因。 如果日志中有类似于Error 504的东西,请尝试在您的清单文件的应用程序标记中使用:

android:usesCleartextTraffic="true"

这对我起作用了。

在此处回答


7

不知道这是否与问题相关,但我的问题是通过使用Glide而不是Picasso得到解决.


同样的问题(在2019年7月25日),Picasso无法加载图像,但Glide可以。不确定原因。 - Jayce

4

如果某些功能无法正常工作,可能是由于托管图片的服务器出现了问题,它们的URL不能直接带您到图片,但后台还有其他操作正在进行。它可能在Chrome或其他浏览器中打开,但不能保证在Picasso中加载。因此,您可以尝试使用以下代码:

final OkHttpClient client = new OkHttpClient.Builder()
        .protocols(Collections.singletonList(Protocol.HTTP_1_1))
        .build();

final Picasso picasso = new Picasso.Builder(this)
        .downloader(new OkHttp3Downloader(client))
        .build();

Picasso.setSingletonInstance(picasso);

这个库提供了OkHttp3Downloader实例,其中https://github.com/JakeWharton/picasso2-okhttp3-downloader是下载器的来源。


1
希望这个解决方案能帮到某些人。
创建名为network的xml文件,并将该代码粘贴到该文件中。
<?xml version="1.0" encoding="utf-8"?>
<network-security-config>
    <base-config cleartextTrafficPermitted="true">
        <trust-anchors>
            <certificates src="system" />
        </trust-anchors>
    </base-config>
</network-security-config>

将这个 network.xml 文件和这一行 android:usesCleartextTraffic="true" 添加到你的 Manifest 中,就像这样。
 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network"
        android:usesCleartextTraffic="true"

愉快编程,保持安全


1
android:usesCleartextTraffic="true" 对我起了作用。 - matteoh

1

//首先将链接存储在字符串中

String url =     
        "https://i.pinimg.com/originals/fc/92/13/fc9213e50a1978c845d7195e988a3322.jpg";
        Picasso.with(this).load(url).into(imageView);

1

谢谢提供的信息,绝对是值得的! - xosuma

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