您的位置:首页 > 移动开发 > Android开发

Android 技术之Picasso图片缓存

2016-12-18 01:39 253 查看
Picasso图片缓存技术有必要了解一下,在日常的项目是经常用到的,以前我们会想到使用HttpUrlConnection和AsyncTask实现远程图片下载,,然后如果每次都是这样的,代码量会增加,这样不好,不好!

首先我们先来了解一下Picasso到底是一个什么,又是怎样用的呢??

picasso是Square公司开源的一个Android图形缓存库,地址http://square.github.io/picasso/,可以实现图片下载和缓存功能。仅仅只需要一行代码就能完全实现图片的异步加载:

Picasso.with(context).load("这里是你的图片地址或者。。。(后面有惊喜)").into(imageView);

就是这么简单的一句话,然后我们来对比一下刚才说HttpUrlConnection和AsyncTask的实现方法:


ublic class MainActivity extends Activity {

private ImageView imageView;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView = (ImageView) findViewById(R.id.image);
String url = "http://www.jycoder.com/json/Image/1.jpg";

// 执行Task
new ImageDownloadTask(ivBasicImage).execute(url);
}

//自定义获取图片Task
private class ImageDownloadTask extends AsyncTask<String, Void, Bitmap> {
ImageView imageView;

public ImageDownloadTask(ImageView imageView) {
this.imageView = imageView;
}

protected Bitmap doInBackground(String... addresses) {
Bitmap bitmap = null;
InputStream in;
try {
// 建立URL连接
URL url = new URL(addresses[0]);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 打开输入流
conn.connect();
in = conn.getInputStream();
// 编码输入流
bitmap = BitmapFactory.decodeStream(in);
} catch (IOException e) {
e.printStackTrace();
} finally {
if(in != null)
in.close();
}
return bitmap;
}

// Task执行完毕,返回bitmap
@Override
protected void onPostExecute(Bitmap result) {
// Set bitmap image for the result
imageView.setImageBitmap(result);
}
}
}


是不是觉得弱爆了,不过如果你倒是可以对这段代码进行封装嘛,个人喜好啊,然后写成一个带参数的方法,然后带入参数请求也是可以的啊,可是从一些优化的角度角度来说,还是今天的主角比较OK的啦!

接下来了解一下 Picasso的其他用法:
(1)适配器:适配器自动发现和重用以前取消的下载:


@Override

public void getView(int position, View convertView, ViewGroup parent) {

SquaredImageView view = (SquaredImageView) convertView;

if (view == null) {

view = new SquaredImageView(context);

}
String url = getItem(position);

Picasso.with(context).load(url).into(view);
}


(2)图像格式转换:很多时候需要将图片进行格式转换或者剪裁以节省内存或者达到我们的布局效果:


Picasso.with(context).load(imageUrl).resize(50,50).centerCrop().into(imageView

其中resize(50,50)根据自己的要求给图片一定的大小:
(3)自定义格式转换:为了实现更多你想要图片转换的效果,你可以自己实现一个实现了Transformation接口的类,然后将其对象传递给transform()方法:


public calss myTransformation implements Transformation{

@Overrride

public Bitmap transform(Bitmap source){

//对source实现自定义裁剪

}
@Override

public String key(){

return “square()”;

}
}


将myTransformation 的对象传递给transform 方法即可

Picasso.with(this).load("http://i.imgur.com/DvpvklR.png")                 .transform(new myTransformation ()).into(iv_test2);


(4)Place holders-空白或者错误占位图片:picasso提供了两种占位图片,未加载完成或者加载发生错误的时需要一张图片作为提示。

Picasso.with(this) .load("http://i.imgur.com/DvpvklR.png") .placeholder(R.drawable.abc) .error(R.drawable.ic_launcher) .transform(new myTransformation ()) .into(iv_test1);


其中placeholder(R.drawable.abc)就是加载前的图片 ,error(R.drawable.ic_launcher)加载错误的时候图片

(5)资源文件的加载:除了加载网络图片picasso还支持加载Resources, assets, files, content providers中的资源文件。

Picasso.with(context).load(R.drawable.landing_screen).into(imageView1);
Picasso.with(context).load(new File(...)).into(imageView2);


这就是刚才上面说的惊喜,你可以自己选择一个 R.drawable.landing_screen

,同时你也可以选择一个文件的图片路径。

在我们的实际项目中可能需要用到adapter适配器(半夜了,偷下懒,不过你们可以借鉴一下其他大神):

ListView显示网络图片

自定义GridView

还有一篇是对Picass的深入理解,想研究的去看看,一时半会看不太懂;

Picasso深入理解
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 图片