我上家公司的产品是日活几百万的一款产品,里面有很大很大量的网络图片。2014年之前我们用的是很古老的ImageLoader,当时线上日志每天都有几百上千条BitMap OOM的日志,我们是各种优化这个ImageLoader(以牺牲图片质量为代价),但是依然止不住OOM爆出,真是头疼不已。后来我们尝试使用了square公司开源的Picasso这个图片加载工具,上线后,奇迹发生了,原来每天几百上千的OOM日志,一条都没了。真是让我们震惊不已,从此Picasso 在我们心中就是图片加载的神器。现在记录下它的一些常用的用法:
指定缓存路径:
private void loadImageCache() { final String imageCacheDir = "";
Picasso picasso = new Picasso.Builder(this).downloader( new OkHttpDownloader(new File(imageCacheDir))).build();
Picasso.setSingletonInstance(picasso);
}
1、fetch()方法将会在后台异步加载图片,但是它既不会在ImageView中显示出来,也不会返回bitmap。它只是会将图片下载下来。目的是为了你之后用这个图片时减少加载时间,当然,后面的Callback可以不传:
Picasso.with(this).load(Url).fetch(new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
}
});
2、把图片加载到ImageView上,并且给一个回调:
Picasso.with(this).load(Url).into(image, new Callback() {
@Override
public void onSuccess() {
}
@Override
public void onError() {
}
});
3、下载图片并且给一个带图片的回调:
Picasso.with(this).load(Url).into(new Target() {
@Override
public void onBitmapLoaded(Bitmap bitmap, Picasso.LoadedFrom from) {
}
@Override
public void onBitmapFailed(Drawable errorDrawable) {
}
@Override
public void onPrepareLoad(Drawable placeHolderDrawable) {
}
});
4、get()方法直接去得到一张图片,当然这个方法是耗时的,不能在UI线程,需要放到new Thread()来做这件事情:(建议还是用上面的回调方便一些)
new Thread(){
@Override
public void run() {
super.run();
try {
Bitmap bitmap = Picasso.with(this).load(url).get();
} catch (IOException e) {
e.printStackTrace();
}
}
}.start();
5、指定优先级。比如,你某张图片和重要,想先加载;某些图片不重要,优先级放低。那么可以这么写(但是需要注意的是:你自己指定的Picasso的请求的顺序代码并没有效果,Picasso是按照你指定的优先级来加载图片的):
Picasso.with(this).load(url)
.centerCrop()
.priority(Picasso.Priority.HIGH)
.into(imageView);
Picasso.with(this).load(url)
.centerCrop()
.priority(Picasso.Priority.LOW)
.into(imageView);
6、picasso的tag用法,有点复杂,可以参看这篇文章:http://blog.csdn.net/u011337574/article/details/51586714:
Picasso.with(this).load(url)
.centerCrop()
.tag("pause")
.into(imageView);
Picasso.with(this).resumeTag("pause");
Picasso.with(this).pauseTag("pause");
Picasso.with(this).cancelTag("pause");
7、picasso自带的图片旋转和缩放,参看这篇:http://blog.csdn.net/u011337574/article/details/51590578
Picasso.with(this).load(url)
.centerCrop()
.rotate(90f)
.into(imageView);
如果你觉得帮到了你,请给作者打赏一口饭吃: