使用Android Picasso将图像预加载到内存/磁盘中

使用Android Picasso将图像预加载到内存/磁盘中,android,picasso,Android,Picasso,我可以在显示之前下载毕加索的图片吗? 我想先缓存图像 示例场景: 用户单击按钮,看到进度条,当图像加载完毕后,用户可以看到屏幕上的图像 我尝试用“get”方法加载图像,但没有缓存图像 Thread thread = new Thread() { @Override public void run() { try { Picasso picasso = PicassoOwnCache.with(getApplicationContext())

我可以在显示之前下载毕加索的图片吗? 我想先缓存图像

示例场景: 用户单击按钮,看到进度条,当图像加载完毕后,用户可以看到屏幕上的图像

我尝试用“get”方法加载图像,但没有缓存图像

Thread thread = new Thread()
{
    @Override
    public void run() {
        try {
            Picasso picasso = PicassoOwnCache.with(getApplicationContext());
            RequestCreator picassoRequest;
            for (String imgUrl : imagesUrls) {
                picassoRequest = picasso.load(imgUrl);
                picassoRequest.get();
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
};

thread.start();
这是我的毕加索单人课

public class PicassoOwnCache {
    static Picasso singleton = null;
    static Cache cache = null;

    public static Picasso with(int cacheSize, Context context) {
        if (singleton == null) {
            int maxSize = calculateMemoryCacheSize(context);
            cache = new LruCache(cacheSize <= maxSize ? cacheSize : maxSize);
            singleton = new Picasso.Builder(context)
                    .memoryCache(cache)
                    .build();
        }
        return singleton;
    }

    public static Picasso with(Context context) {
        if (singleton == null) {
            cache = new LruCache(calculateMemoryCacheSize(context));
            singleton = new Picasso.Builder(context)
                    .memoryCache(cache)
                    .build();
        }
        return singleton;
    }

    static int calculateMemoryCacheSize(Context context) {
        ActivityManager am = (ActivityManager) context.getSystemService(ACTIVITY_SERVICE);
        boolean largeHeap = (context.getApplicationInfo().flags & FLAG_LARGE_HEAP) != 0;
        int memoryClass = am.getMemoryClass();
        if (largeHeap && Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
            memoryClass = ActivityManagerHoneycomb.getLargeMemoryClass(am);
        }
        return 1024 * 1024 * memoryClass / 10;//7;
    }

    @TargetApi(Build.VERSION_CODES.HONEYCOMB)
    private static class ActivityManagerHoneycomb {
        static int getLargeMemoryClass(ActivityManager activityManager) {
            return activityManager.getLargeMemoryClass();
        }
    }
}
不幸的是,这不起作用。
谢谢你的建议

正如dnkoutso所说,您只需使用:

fetch() 这是毕加索的天赋!请投票支持dnkoutso的评论


PS我假设你问的是“如何制作毕加索预加载图像?”

请注意,毕加索绝对且完全地完全地处理所有图像的缓存--您无需进一步努力--这就是毕加索的目的,也是您使用它的原因--这就是毕加索存在的理由。所以你不必为此担心

同样,如果你说的是预加载,或者让我们说“预热”,那么就按照dnkoutso说的做

(顺便说一句,所有这些都可以简单地归结为:“在图像的长列表视图中,事情看起来有多好”。事实上,我们发现毕加索非常流畅,一般来说,你根本不需要担心大多数应用程序的预热阶段。事实上,甚至像这样的关键概念

注意-这篇著名的文章已经从网上消失了


…真的,毕加索很容易使用,你真的几乎不需要费心于“老式”仔细处理ListView。简言之,我们发现,你几乎不需要担心“预热”。希望这能有所帮助。)

你可以在显示之前获取图像。加载后,可以将其加载到imageView中。当您第二次调用毕加索#load()时,图像将不会再次下载。它将来自缓存

startProgress(); // handle showing progress view somehow
Picasso.with(getActivity()).load(imageUrl).fetch(new Callback() {
    @Override
    public void onSuccess() {
        Picasso.with(getActivity()).load(imageUrl).into(imgViewMedia);
        stopProgress(); // handle stopping progress view somehow
    }

    @Override
    public void onError() {

    }
});

为什么不改用
fetch()。我强烈建议您在此处使用
fetch()
,让毕加索为您处理线程和请求合并。如果正在进行提取,并且出现了一个
到()
的消息,它将合并这两个消息并传递它们。user3032346。。你是否完全意识到毕加索完全自动地为你处理缓存?这就是毕加索的主要目的。有点不清楚你在问什么。就我所知,你的整个代码库是完全没有必要的。只需使用一行毕加索代码即可加载图像。已解决!fetch()工作正常。。。fnx!
startProgress(); // handle showing progress view somehow
Picasso.with(getActivity()).load(imageUrl).fetch(new Callback() {
    @Override
    public void onSuccess() {
        Picasso.with(getActivity()).load(imageUrl).into(imgViewMedia);
        stopProgress(); // handle stopping progress view somehow
    }

    @Override
    public void onError() {

    }
});