Android Picasso Image无法加载

时间:2016-03-16 19:43:54

标签: android imageview picasso

有两种情况我加载图像,第一种是直接从互联网上加载,第二种是加载在设备中下载的图像。每当我加载时,显示10个图像中的8~9个,并且1-2个丢失。我看到解码返回false,并尽可能地坚持google,但无法提出。

  
      
  1. WAIT_FOR_CONCURRENT_GC阻止了22毫秒
  2.   
  3. WAIT_FOR_CONCURRENT_GC阻止了20毫秒
  4.   
  5. GC_FOR_ALLOC释放718K,31%免费9948K / 14256K,暂停49ms,总计51ms
  6.   
  7. D / skia:--- decoder->解码返回falseGC_CONCURRENT释放1370K,30%免费10081K / 14256K,暂停3ms + 2ms,总计33ms
  8.   
  9. GC_FOR_ALLOC释放916K,30%免费10029K / 14256K,暂停66ms,总计67ms
  10.   

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

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

任何想法如何解决这个问题?我每次在屏幕上加载图像时都会调用fit()/ resize()。非常感谢,提前感谢!

仅供参考,我在机器,模拟器和真实设备三星Galaxy Tab 3上进行测试,并且在模拟器上没有任何问题,但在真实设备上会出现问题。

更新:

它是由图像的色彩空间引起的,其中未显示的图像是YMCK色彩空间中的图像。

18 个答案:

答案 0 :(得分:23)

您可以使用Picasso.with(Context).setLoggingEnabled(true)打开毕加索日志。您可能会看到一条错误消息,其中包含原因。

为了以防万一,还需要记录您正在使用的URL并尝试使用浏览器。

答案 1 :(得分:13)

检查清单中的Internet权限

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

答案 2 :(得分:7)

尝试在您的网址开头用 “ https:” 替换 “ http:” (如果适用)

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

为我工作。

答案 3 :(得分:6)

在Picasso中,您应该使用.load()方法传递网址,以便从互联网和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);

答案 4 :(得分:4)

您可以使用Picasso.with(Context).setLoggingEnabled(true)启用调试,以排除确切原因。 如果日志中有类似Error 504的内容,请尝试使用试试使用

android:usesCleartextTraffic="true"

在清单的应用程序标记中。对我有用

Answered here

答案 5 :(得分:2)

不知道它与此问题有关,但我的问题通过使用Glide而不是Picasso来解决。

答案 6 :(得分:1)

看看Picasso: out of memory

检查您在ImageView中使用固定大小,请参阅@Samuil Yanovski answer

的更多信息

希望这会有所帮助!!

答案 7 :(得分:1)

如果有什么不起作用,那是因为托管图片的服务器存在一些问题,他们的网址并没有直接带您到图片,但在后端还有其他工作正常,它可能会在Chrome或其他浏览器中打开,但在毕加索中肯定不会加载,所以你可以试试这段代码:

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

答案 8 :(得分:1)

//先将链接存入字符串

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

答案 9 :(得分:0)

希望这个解决方案对某人有帮助

创建 xml 文件名 network 并将该代码粘贴到该文件中

<?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"

 <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:networkSecurityConfig="@xml/network"
        android:usesCleartextTraffic="true"

快乐编码,保持安全

答案 10 :(得分:0)

也许这对某人有帮助

对于我的网址,我使用的是http:// localhost :8080 / api / get-image / image.jpg ...

您需要设置服务器的IP地址而不是localhost!

答案 11 :(得分:0)

没有人会像我一样愚蠢,但是为了完整性:如果在布局文件的图像视图中添加色彩,它将掩盖成功加载的图像。

答案 12 :(得分:0)

我曾经遇到过同样的问题,但是下面是为我工作的解决方案。

implementation 'com.squareup.picasso:picasso:2.5.2'
implementation 'com.squareup.okhttp:okhttp:2.3.0'
implementation 'com.squareup.okhttp:okhttp-urlconnection:2.3.0'

================================================ ===============================

private static Picasso picasso = null;
public static Picasso.Builder picassoBuilder ;


public static void loadImageInto(Context context, String url, int width, int 
 height, Target target) {
    initPicasso(context);
  picasso.load(url)
            .error(android.R.drawable.stat_notify_error)
            .resize(width, height)
            .centerCrop()
            .into(target);
}

public static void initPicasso(Context context) {
    if (picasso == null) {
         picassoBuilder = new Picasso.Builder(context);

        try {
            Picasso.setSingletonInstance(picasso);
        } catch (IllegalStateException ignored) {
            // Picasso instance was already set
            // cannot set it after Picasso.with(Context) was already in use
        }
        picassoBuilder.downloader(new OkHttpDownloader(new OkHttpClient())).memoryCache(Cache.NONE).loggingEnabled(true).indicatorsEnabled(true);

        picasso = picassoBuilder.build();
        
    }
}

答案 13 :(得分:0)

使用下面的链接

 byte[] imageBytes;


    using (var webClient = new WebClient())
    {
      imageBytes = webClient.DownloadData(imageUri);
    }

    Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);

    imgProflle.SetImageBitmap(bitmap);

Xamarin或.Net

@Entity(name = "Foo")
@Table(name = "Foo")

class Foo {
    @Id
    @Column(name="FOO_ID")
    private String fooId;

    @Column(name="FOO_SOMETHING")
    private String fooSomething;

}

答案 14 :(得分:0)

检查清单中是否具有以下权限:

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

答案 15 :(得分:0)

u.email

答案 16 :(得分:0)

确保您的imageUrl包含 https 而不是 http 如果您的imageUrl包含http,则创建network_Security_config文件     在res文件夹xml文件夹下,并提及URL     例如

    <<network-security-config>
            <domain-config cleartextTrafficPermitted="true">
                <domain includeSubdomains="true">www.your_domain.com</domain>
            </domain-config>
    </network-security-config>

答案 17 :(得分:0)

我遇到了同样的错误,我调整了相同图像的大小,并将其上传到Firebase,然后使用毕加索加载了URL,这一次它可以正常工作;图片已成功加载。

在调整大小之前,没有显示相同的图像,也没有任何毕加索日志。

我花了将近两天的时间才意识到真正的问题在于图像尺寸。我将图片尺寸调整为500x500,一切正常。

注意:就我而言,我是从设备的摄像头捕获图像,然后将其上传到Firestore,然后使用毕加索加载图像。因此,为了解决此问题,我开始使用<ion-list lines="none"> <ion-item *ngfor="let msg of messages"> {{ msg.text }} </ion-item> </ion-list> 方法调整图片大小,然后将调整后的图片保存到本地存储中,并将其上传到Firestore。