我想知道是否有任何方法可以轻松地将Picasso的预先缓存的图像文件夹捆绑在一个应用程序中。
我的理由是使用一些基本信息填充应用程序,即使用户第一次打开应用程序时没有/有限的互联网连接也可以访问。
可以使用cache/picasso-cache
检索$ adb pull /data/data/com.package.name/ .
文件夹,但与Realm(https://realm.io/docs/objc/latest/#bundling-a-realm-with-an-app)不同,似乎没有办法让Picasso意识到它。
答案 0 :(得分:0)
虽然只使用预先制作的缓存非常容易,但我对此有了第二个想法:
从模拟器中提取的缓存相当大。
在我的用例中,只有在没有互联网可用时才向用户显示一些缩略图就足够了。它可能要小得多。
我的解决方案是:
我陷入了陷阱:
.placeholder(R.drawable.id)
无法正常工作,因为它会在加载目标图像之前使用占位符,可能是为了节省资源/内存.error(R.drawable.id)
几乎可以正常工作,但毕加索不能像对异步加载的图像一样转换placeholder
和error
图像。这意味着.fit()
,.centerInside()
和其他转换不会工作。 (见https://github.com/square/picasso/issues/337)加载可变资源名称对我来说至关重要。这发生在getThumbnail()
上。我将所有图片命名为product_thumbnail_{DB_ID}
。
private int getThumbnail(Integer id)
{
Resources res = context.getResources();
int resID = res.getIdentifier("product_thumbnail_"+ id, "drawable", context.getPackageName());
return resID;
}
我的适配器内的主要逻辑:
final Context context = viewHolder.itemView.getContext();
final ImageView imageHolder = viewHolder.productImageHolder;
final int thumbnail = getThumbnail(product.getId());
if(thumbnail != 0)
{
Picasso.with(context)
.load(product.getImageUrl())
.networkPolicy(NetworkPolicy.OFFLINE)
.fit()
.centerInside()
.into(imageHolder, new com.squareup.picasso.Callback() {
@Override
public void onSuccess() { }
@Override
public void onError() {
useThumbnail(thumbnail, imageHolder, context);
}
});
}
else
{
Picasso.with(viewHolder.itemView.getContext())
.load(product.getImageUrl())
.networkPolicy(NetworkPolicy.OFFLINE)
.fit()
.centerInside()
.into(imageHolder);
}
useThumbnail():
private void useThumbnail(int thumb, ImageView imageHolder, Context context)
{
Picasso.with(context)
.load(thumb)
.networkPolicy(NetworkPolicy.NO_CACHE)
.fit()
.centerInside()
.into(imageHolder);
}