有两种情况我加载图像,第一种是直接从互联网上加载,第二种是加载在设备中下载的图像。每当我加载时,显示10个图像中的8~9个,并且1-2个丢失。我看到解码返回false,并尽可能地坚持google,但无法提出。
- WAIT_FOR_CONCURRENT_GC阻止了22毫秒
- WAIT_FOR_CONCURRENT_GC阻止了20毫秒
- GC_FOR_ALLOC释放718K,31%免费9948K / 14256K,暂停49ms,总计51ms
- D / skia:--- decoder->解码返回falseGC_CONCURRENT释放1370K,30%免费10081K / 14256K,暂停3ms + 2ms,总计33ms
- 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()。非常感谢,提前感谢!
仅供参考,我在机器,模拟器和真实设备三星Galaxy Tab 3上进行测试,并且在模拟器上没有任何问题,但在真实设备上会出现问题。
更新:
它是由图像的色彩空间引起的,其中未显示的图像是YMCK色彩空间中的图像。
答案 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"
在清单的应用程序标记中。对我有用
答案 5 :(得分:2)
不知道它与此问题有关,但我的问题通过使用Glide而不是Picasso来解决。
答案 6 :(得分:1)
答案 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。