Android Picasso:如何从缓存中获取Bitmap图片?
从Picasso缓存中提取Bitmap的方法
嘿,我来帮你搞定从Picasso缓存里获取Bitmap的问题!其实Picasso本身就提供了几种直接从缓存(内存/磁盘)提取Bitmap的方式,下面给你详细说明:
1. 同步获取(注意:不能在主线程调用)
如果你的代码是在子线程里执行的,可以直接用get()方法,Picasso会优先从内存缓存查找,找不到再查磁盘缓存,最后才会发起网络请求:
try { Bitmap cachedBitmap = Picasso.get() .load("你的图片URL") // 填你之前加载ImageView时用的URL .get(); // 拿到缓存Bitmap后执行你需要的操作 } catch (IOException e) { e.printStackTrace(); // 处理加载失败的情况(比如缓存无数据且网络请求失败) }
⚠️ 重要提醒:这个方法会阻塞线程,绝对不能在主线程调用,否则会抛出NetworkOnMainThreadException!
2. 异步获取(推荐在主线程使用)
如果要在主线程操作,就用Target接口来异步获取,还能明确知道Bitmap的来源:
// 建议把Target作为类的成员变量持有,避免被GC回收导致回调不触发 private Target cacheTarget = new Target() { @Override public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) { // 通过LoadedFrom判断来源: // LoadedFrom.MEMORY = 来自内存缓存 // LoadedFrom.DISK = 来自磁盘缓存 // LoadedFrom.NETWORK = 来自网络(非缓存) if (from != Picasso.LoadedFrom.NETWORK) { // 这里就是缓存里的Bitmap啦 // 比如保存到本地或者用于其他View } } @Override public void onBitmapFailed(Exception e, Drawable errorDrawable) { // 加载失败的处理逻辑 } @Override public void onPrepareLoad(Drawable placeHolderDrawable) { // 加载开始前可以显示占位图 } }; // 调用加载逻辑 Picasso.get() .load("你的图片URL") .into(cacheTarget);
3. 从已加载的ImageView中提取(如果图片已显示在View上)
如果你已经用Picasso把图片加载到ImageView里了,也可以直接从ImageView的Drawable中提取Bitmap:
ImageView yourImageView = findViewById(R.id.your_image_view); Drawable drawable = yourImageView.getDrawable(); if (drawable instanceof BitmapDrawable) { Bitmap bitmap = ((BitmapDrawable) drawable).getBitmap(); // 成功拿到Bitmap }
不过这个方法的前提是ImageView已经完成加载,否则可能拿到的是占位图或者null。
额外注意事项
- 确保没有禁用Picasso的缓存:如果之前调用过
memoryPolicy(MemoryPolicy.NO_CACHE, MemoryPolicy.NO_STORE)或者networkPolicy(NetworkPolicy.NO_CACHE),缓存会失效,自然拿不到缓存的Bitmap。 - 图片URL要和之前加载ImageView时完全一致:Picasso是通过URL作为缓存key的,哪怕参数顺序不同,都会被当成不同的缓存项。
内容的提问来源于stack exchange,提问作者justmee




