You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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

火山引擎 最新活动