Android毕加索图像不加载
我加载图像有两种情况,第一种是直接从internet加载图像,第二种是加载在设备中下载的图像。每当我加载时,10个图像中有8~9个被显示,1-2个丢失。我看到解码结果是错误的,谷歌尽我所能地搜索,但是没有找到Android毕加索图像不加载,android,imageview,picasso,Android,Imageview,Picasso,我加载图像有两种情况,第一种是直接从internet加载图像,第二种是加载在设备中下载的图像。每当我加载时,10个图像中有8~9个被显示,1-2个丢失。我看到解码结果是错误的,谷歌尽我所能地搜索,但是没有找到 等待\u并发\u GC阻塞22ms 等待\u并发\u GC阻塞20ms GC_FOR_ALLOC freed 718K,31%free 9948K/14256K,暂停49ms,总计51ms D/skia:---解码器->解码返回错误GC_并发释放1370K,30%释放10081K/1425
Picasso.with(activity)
.load(path)
.placeholder(R.drawable.thumbnail_placeholder)
.resize(width,height)
.into(imageView);
有没有办法解决这个问题?每次在屏幕上加载图像时,我都会调用fit()/resize()。非常感谢您的帮助,提前感谢
仅供参考,我在两台机器、模拟器和真实设备(三星Galaxy Tab 3)上都进行了测试,在模拟器上工作没有任何问题,但在真实设备上会出现问题
更新:
这是由图像的颜色空间引起的,没有显示的图像是在YMCK颜色空间中的图像 您可以使用
Picasso.with(Context).setLoggingEnabled(true)
打开毕加索日志。您可能会看到一条带有原因的错误消息
还值得记录您正在使用的URL并在浏览器中试用,以防万一。看看
检查您是否在ImageView中使用固定大小,请参阅更多信息以查看
希望这有帮助 在毕加索中,您应该在
.load()
方法中传递url以从internet加载图片,在文件的对象中键入url以从设备存储器加载图片
因此,如果图片存储在设备上,请按如下方式加载:
Picasso.with(activity)
.load(new File(path))
.placeholder(R.drawable.thumbnail_placeholder)
.resize(width,height)
.into(imageView);
并使用此代码从internet加载图片:
Picasso.with(activity)
.load(path)
.placeholder(R.drawable.thumbnail_placeholder)
.resize(width,height)
.into(imageView);
若任何东西都不起作用,那个是因为托管图像的服务器存在一些问题,它们的url不会直接将您带到图像,但在后端,其他东西正在工作,它可能会在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实例由该库提供。
我不知道它是否与这个问题有关,但我的问题是用Glide而不是毕加索解决的。在manifaest中检查互联网权限
<uses-permission android:name="android.permission.INTERNET"/>
我也遇到了同样的错误,我调整了同一幅图像的大小并将其上传到firebase,然后使用毕加索加载其URL,这次效果非常好;图像已成功加载
在调整大小之前,没有显示相同的图像,也没有毕加索的日志
我花了将近两天的时间才意识到真正的问题在于图像大小。我将图像大小调整为500x500,一切正常
注意:在我的例子中,我是从设备的摄像头捕捉图像,然后将其上传到firestore,然后使用毕加索加载图像。因此,为了解决这个问题,我开始在activityResult()方法中调整图像大小,然后将调整大小的图像保存到本地存储并上传到firestore。确保您的图像URL包含https而不是http
如果您的imageUrl包含http,则创建网络安全配置文件
在res文件夹xml文件夹下,并提及URL
例如
检查您在清单中是否具有以下权限:
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.INTERNET"/>
尝试将Url开头的http:替换为https:(如果适用)
适合我。使用下面的链接
Picasso.Get().Load(imageUri).Placeholder(Resource.Drawable.patient_profile_pic).Resize(100, 100).Into(imgProflle);
Xamarin或.Net
byte[] imageBytes;
using (var webClient = new WebClient())
{
imageBytes = webClient.DownloadData(imageUri);
}
Bitmap bitmap = BitmapFactory.DecodeByteArray(imageBytes, 0, imageBytes.Length);
imgProflle.SetImageBitmap(bitmap);
我曾面临同样的问题,但下面是对我有效的解决方案
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();
}
}
没有人会像我这样愚蠢,但为了完整性:如果你在布局文件中的图像视图中添加一种染色颜色,它会模糊成功加载的图像。你可以使用Picasso.with(Context).setLoggingEnabled(true)
来启用调试,以便排除确切的原因。
如果日志有类似于错误504的内容
请尝试使用
android:usesCleartextTraffic=“true”
在清单的应用程序标记中。它对我有用
也许这对某人有帮助
对于我的url,我使用的是http://localhost:8080/api/get image/image.jpg
您需要设置服务器的ip而不是本地主机 //首先以字符串形式存储链接
String url =
"https://i.pinimg.com/originals/fc/92/13/fc9213e50a1978c845d7195e988a3322.jpg";
Picasso.with(this).load(url).into(imageView);
希望这个解决方案能帮助别人
创建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”,如下所示
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network"
android:usesCleartextTraffic="true"
我怀疑这是内存问题,你能用较小的图片试试吗?也许图片的url在你的国家被屏蔽了。有趣的是,我一定会试试。谢谢你的时间!我想这已经变成了Picasso.get().setLoggingEnabled(true)
谢谢你提供的信息,def。值得一试!这篇文章帮助我从存储器中加载图像。谢谢您知道如何在不指定宽度和高度的情况下进行中心裁剪吗?Glide会自动完成,但毕加索要求你提供数值。天哪,这是一个简单的答案(19年7月25日)。。毕加索不愿载入这幅图像,但格莱德载入了。不知道为什么。在我的情况下,我有一个向量绘制,毕加索仍然没有加载它。把它扔给Glide了,是的。Glide甚至还有一些额外的方法,比如加载byter数组等。很适合从数据库加载,而无需自己手动解码位图。是的,必须输入“IP地址”而不是本地主机。是的,我测试了这个URL,它正在工作。
String url =
"https://i.pinimg.com/originals/fc/92/13/fc9213e50a1978c845d7195e988a3322.jpg";
Picasso.with(this).load(url).into(imageView);
<?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>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:networkSecurityConfig="@xml/network"
android:usesCleartextTraffic="true"