【问题标题】:Killing application Picasso reloads the images everywhere in application in android杀死应用程序毕加索在android中的应用程序中重新加载图像
【发布时间】:2016-12-31 09:26:43
【问题描述】:
我已经实现了 Picasso 库来加载图像。在我们终止应用程序之前,图像缓存运行良好。如果应用程序被杀死 Picasso 再次加载图像,则不会缓存。这是这个库中的一个众所周知的错误,因为我在各种博客中读过它,在某处我读到更新毕加索库解决了这个问题,我做了同样的事情,但它仍然存在。现在我正在使用 Picasso Version2.5.2。如果有人对毕加索有很好的体验,请告诉我一些事情。
毕加索的最新版本是什么?
这个问题在最新版本的毕加索中仍然存在吗?
有没有棘手的解决方案?
我需要使用哪个库来解决这个问题?
提前致谢。
【问题讨论】:
标签:
java
android
caching
picasso
image-loading
【解决方案1】:
要在杀死应用程序后加载图像,您应该按照说明进行操作:
- 服务器应该返回带有标题
Cache-Control的图像
即Cache-Control:public, max-age=604800
更多信息:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Cache-Control
- 您应该创建自己的毕加索实例:
Cache cache = new Cache(context.getCacheDir(), 30000000);
OkHttpClient client = new OkHttpClient.Builder().cache(cache).build();
OkHttp3Downloader downloader = new OkHttp3Downloader(client);
Picasso picasso = new Picasso.Builder(appContext).downloader(downloader).build();
- 加载图片:
picasso.load(url).into(imageView);
说明:
毕加索没有磁盘缓存。它委托给您用于该功能的任何 HTTP 客户端(依赖于 HTTP 缓存语义进行缓存控制)。因此,您寻求的行为是免费的
【解决方案2】:
这就是我如何实现 Picasso 以强制它在再次在线获取图像之前先查找缓存记录。请注意,该库有 65MB 的缓存限制。请阅读文档中的某处
Picasso.with(context)
.load(Link)
.placeholder(R.drawable.grad)
.error(R.drawable.grad)
.networkPolicy(NetworkPolicy.OFFLINE)
.fit()
.centerCrop()
.into(image, new Callback() {
@Override
public void onSuccess() {
//successfully loads from CACHE
image.setClickable(true);
..............
}
@Override
public void onError() {
// fetch online because cache is not there
Picasso.with(context)
.load(Link)
.fetch(new Callback() {
@Override
public void onSuccess() {
Picasso.with(context)
.load(Link)
.fit()
.centerCrop()
.into(image, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() {
//success..
}
@Override
public void onError() {
Toast.makeText(context, "No Image Found. Try again later", Toast.LENGTH_SHORT).show();
image.setClickable(false);
}
});
}
@Override
public void onError() {
//NO IMAGE offline or online
Toast.makeText(context, "No Image Found. Try again later", Toast.LENGTH_SHORT).show();
image.setClickable(false);
}
});
}
});