您的位置:首页 > 理论基础 > 计算机网络

一句代码加载网络图片到ImageView——Android Picasso

2015-07-17 14:13 633 查看
在这里介绍一个Android框架:Picasso。

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

public class MainActivity extends Activity {
private ImageView imageView;
private String url="http://h.hiphotos.baidu.com/image/pic/item/64380cd7912397dd6e6c3adf5c82b2b7d1a287d0.jpg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
imageView=(ImageView) findViewById(R.id.TestImageID);
<pre name="code" class="java">Picasso.with(this).load(url).into(imageView);


}}


可以看到实际上加载图片的代码就一句:

Picasso.with(this).load(url).into(imageView);
是不是很方便呢?当然大家在测试的时候还是需要加上访问网络权限的。

这么方便的框架,相信大家对它已经开始感兴趣了。

Picasso的特点还不止这个,还有以下几个特点:

1.在adapter中需要取消已经不在视野范围的ImageView图片资源的加载,否则会导致图片错位,Picasso已经解决了这个问题。

2.使用复杂的图片压缩转换来尽可能的减少内存消耗

3.自带内存和硬盘二级缓存功能

在实际开发过程中很多时候ImageView是用在ListView之中的。那么如果Picasso不能够自动缓存图片,检测图片的重用的话那也没什么卵用。幸好~~Picasso还是有卵用的!Picasso可以自动重用,自动取消加载。看代码:

MainActivity.java

public class MainActivity extends Activity {

private ListView listview;
private List<String> datas;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listview=(ListView) findViewById(R.id.TestListViewID);
initData();
listview.setAdapter(new LoadImageAdapter(this, datas));
}
private void initData(){
datas=new ArrayList<String>();
datas.add("http://h.hiphotos.baidu.com/image/pic/item/64380cd7912397dd6e6c3adf5c82b2b7d1a287d0.jpg");
datas.add("http://f.hiphotos.baidu.com/image/pic/item/5fdf8db1cb1349540cf84bbf534e9258d0094a02.jpg");
datas.add("http://f.hiphotos.baidu.com/image/pic/item/267f9e2f0708283862f47ecfbd99a9014d08f174.jpg");
datas.add("http://a.hiphotos.baidu.com/image/pic/item/8326cffc1e178a82d134df7bf303738da877e8e5.jpg");
datas.add("http://h.hiphotos.baidu.com/image/pic/item/241f95cad1c8a786d6e4e9d56209c93d71cf501a.jpg");
datas.add("http://f.hiphotos.baidu.com/image/pic/item/b8389b504fc2d562e078f91ee21190ef77c66cd4.jpg");
datas.add("http://c.hiphotos.baidu.com/image/pic/item/55e736d12f2eb938f91d5301d0628535e4dd6fd4.jpg");
}
}
LoadImageAdapter.java

public class LoadImageAdapter extends BaseAdapter{
private List<String> resList=new ArrayList<String>();
private Context mContext;
public LoadImageAdapter(Context context,List<String> list){
resList=list;
mContext=context;
}

@Override
public int getCount() {
// TODO Auto-generated method stub
return resList.size();
}

@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return resList.get(arg0);
}

@Override
public long getItemId(int position) {
// TODO Auto-generated method stub
return position;
}

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

View view=LayoutInflater.from(mContext).inflate(R.layout.listviewitem, null);

ImageView imageview=(ImageView) view.findViewById(R.id.imageviewID);

Picasso.with(mContext).load(getItem(position).toString()).into(imageview);

return view;
}

}


效果图就不贴出来了,有兴趣的可以复制以上代码运行一下,就会发现Picasso可以自动重用,自动取消加载。

有时候网络上的某张图片太大,放到手机上不但不合适而且费内存。我们可以使用Picasso的图片转换功能:

Picasso.with(this).load("http://h.hiphotos.baidu.com/image/pic/item/64380cd7912397dd6e6c3adf5c82b2b7d1a287d0.jpg")
.resize(100, 100).centerCrop().into(imageView);
在手机上加载图片往往是需要等待一段时间才会加载完成甚至有可能会加载出错,Picasso也为我们考虑到这一点。我们可以设定在图片空白或出错的时候显示指定的图片:

Picasso.with(context)
.load(url)
.placeholder(R.drawable.user_placeholder)
.error(R.drawable.user_placeholder_error)
.into(imageView);
Picasso不但能够用来加载网络图片还能够加载本地sd卡上的图片,程序资源文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: