我可以在展示之前用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());
不幸的是,这不起作用。 感谢yopur的建议!
答案 0 :(得分:36)
正如dnkoutso所说,你只需使用:
毕加索的内置!请upvote dnkoutso的评论。
PS我假设你问的是“我如何制作毕加索预载图像?”
请注意,毕加索完全和完全完全处理所有图像缓存 - 没有你的进一步努力 - 这是毕加索的目的以及你为什么使用它 - 这是毕加索的存在理由即可。所以你不必担心这个。
如果您正在谈论预加载或者说“热身”,那么再做一次dnkoutso所说的话。
(顺便说一句,所有这一切都归结为:“在图片的长ListView中有多好看。”我们实际上发现Picasso非常流畅,你甚至不需要担心,一般来说,关于大多数应用程序的预热阶段。事实上,甚至是像这样的关键概念......
http://lucasr.org/2012/04/05/performance-tips-for-androids-listview/
注意 - 这篇着名的文章http://www.programmingmobile.com/2012/03/buttery-smooth-list-scrolling-in.html已经从网上消失了。
......真的毕加索真的很容易使用,你真的很少需要打扰“老式”仔细的ListView处理。总之,我们发现,你很少需要担心“热身”。希望它有所帮助。)
答案 1 :(得分:8)
您可以在显示之前获取图像。加载后,您可以加载到imageView。当你第二次调用Picasso#load()时,不会再次下载图像。它将来自缓存。
CVPixelBufferLockBaseAddress(cvImageBuffer,0);
// get image properties
uint8_t *baseAddress = (uint8_t *)CVPixelBufferGetBaseAddress(cvImageBuffer);
size_t bytesPerRow = CVPixelBufferGetBytesPerRow(cvImageBuffer);
size_t width = CVPixelBufferGetWidth(cvImageBuffer);
size_t height = CVPixelBufferGetHeight(cvImageBuffer);
/*Create a CGImageRef from the CVImageBufferRef*/
CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB();
CGContextRef cgContext = CGBitmapContextCreate(baseAddress, width, height, 8, bytesPerRow, colorSpace, kCGBitmapByteOrder32Little | kCGImageAlphaPremultipliedFirst);
CGImageRef cgImage = CGBitmapContextCreateImage(cgContext);
// release context and colorspace
CGContextRelease(cgContext);
CGColorSpaceRelease(colorSpace);
// now CGImageRef can be displayed either by setting CALayer content
// or by creating a [UIImage withCGImage:geImage] that can be displayed on
// UIImageView ...