19

我可以在显示之前使用 Picasso 下载图像吗?我想先缓存图像。

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

我尝试使用“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();
        }
    }
}

接下来向用户显示(缓存)图像。

Picasso picasso = PicassoOwnCache.with(getApplicationContext());
picasso.setDebugging(true) ;
RequestCreator picassoRequest;
picassoRequest = picasso.load(imgUrl);
picassoRequest
        .placeholder(R.drawable.loading_logo)
        .error(R.drawable.no_internet)
        .fit() // I tries also without fit()
        .into(holder.getImageView());

不幸的是,这不起作用。感谢您的建议!

4

2 回答 2

39

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

拿来()

这是毕加索内置的!请支持 dnkoutso 的评论。


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

请注意,毕加索绝对且完全地处理所有图像的缓存——无需您付出更多努力——这就是毕加索的目的以及您使用它的原因——这就是毕加索存在的理由。所以你不必担心这个。

同样,如果您在谈论预加载或让我们说“热身”,那么请完全按照 dnkoutso 所说的去做。

(顺便说一句,所有这一切都归结为:“在长长的 ListViews 图像中,东西看起来有多好”。我们实际上发现 Picasso 就是这么流畅,你真的不需要担心,一般来说,关于大多数应用程序的热身阶段。事实上,即使是这样的关键概念......

http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/

注意 - 这篇著名的文章http://www.programmingmobile.com/2012/03/buttery-smooth-list-scrolling-in.html已经从网络上消失了..

... 真的 Picasso 就是这么容易使用,你真的很少需要用“老式”仔细的 ListView 处理来打扰。简而言之,我们发现您很少需要担心“热身”。希望能帮助到你。)

于 2014-06-06T07:43:05.677 回答
9

您可以在显示之前获取图像。加载完成后,可以加载到 imageView 中。当您第二次调用 Picasso#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() {

    }
});
于 2015-09-29T17:16:52.807 回答