转载请注明出处:明桑Android
在Android开发中,常需要从远程获取图片并显示在客户端,当然我们可以使用原生HttpUrlConnection和AsyncTask等操作来完成,但并不推荐,因为这样不仅需要我们编写大量的代码,还需要处理缓存和下载管理等,最好自己封装成库或者采用第三方库;
Picasso:A Powerful Image Downloading and Caching Library for Android
根据名字就知道它是跟什么相关了(Picasso:毕加索)它的基本操作非常简单喔
文章主要介绍如何通过基本的HttpUrlConnection和AcyncTask实现获取远程图片;以及如何使用Picasso框架来实现,最后作为练习实现一个小Demo,希望对正在学习Android网络操作的同学有所帮助;
1,使用HttpUrlConnection和AsyncTask实现远程图片下载
使用HttpUrlConnection和AsyncTask获取远程图片,需要以下几步:
- 建立HttpURLConnection:首先需要和远程图片url建立一个连接:
HttpUrlConnection connection=url.openConnection();//url代表图片地址
- 从connection中获取输入流:
InputStream in=connection.getInputStream();
- 使用BitmapFactory.decodeStream(in)将输入流编码成Bitmap:
Bitmap bitmap=BitmapFactory.decodeStream(in);
- imageView.setBitmap(bitmap),将bitmap对象添加至ImageView中:
imageView.setBitmap(bitmap)
我们知道在主线程中是无法执行以上网络操作的,所以需要AsyncTask,将耗时操作运行在后台线程中,对于HttpUrlConnection和AsyncTask具体操作不熟悉的可以看看我写的上一篇文章:Android网络编程 HttpUrlConnection HttpClient AsyncTask;
以下是使用上述代码完成图片下载的示例:
public 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);
}
}
}
2,Picasso框架
什么是Picasso:
强大的图片下载和缓存的第三方库;我觉得这就是对它最准确的描述了,至于其他特性,可以参见官网介绍:Picasso
如何使用Picasso
-
跟所有第三方库的使用一样,我们需要将其添加进我们的项目:可以直接下载最新.jar包 picasso-2.5.2.jar,也可以从github中将其clone到本地:picasso
-
如果是直接下载的.jar包,将其添加至项目
libs
文件夹下,并右键jar包,选择将其Add As Library: -
如果是clone的项目,你还是需要将其编译成jar包,然后根据第1步操作添加进项目:以下是编译过程:
首先进入你clone的Picasso目录下,然后在命令行执行如下命令
android update project -p
ant jar
-
如果是直接下载的.jar包,将其添加至项目
2.Picasso的基本用法:
将Picasso添加进项目后,要使用它非常简单,只需要一行代码就能搞定:
Picasso.with(context).load(imageUrl).into(imageView);
短短的一行代码为我们解决了很多问题:
- 自动将图像缓存在本地
- 通过图片压缩转换以减少内存消耗
- 自动处理了ImageView的回收,即自动取消不在视野范围内的ImageView视图资源的加载;
3.适配器:适配器自动发现和重用以前取消的下载:
@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);
}
4.图像格式转换:很多时候需要将图片进行格式转换或者剪裁以节省内存或者达到我们的布局效果:
剪裁大小:
Picasso.with(context).load(imageUrl).resize(50,50).centerCrop().into(imageView);
自定义格式转换:为了实现更多你想要图片转换的效果,你可以自己实现一个实现了Transformation接口的类,然后将其对象传递给transform()方法:
public calss myTransformation implements Transformation{
@Overrride
public Bitmap transform(Bitmap source){
//对source实现自定义裁剪
}
@Override
public String key(){
return "square()";
}
}
5.占位符图片:所谓的占位符图像即当图片未正常显示时默认的图片,通过placeholder()设置,Picasso也支持设置图片显示错误时显示的默认图片,通过error()设置:
Picasso.wint(context).load(imageUrl).placeholder(R.drawable.image_placeholder).error(R.drawable.image_error_placeholder).into(imageView);
6.载入本地资源:除了通过网络下载图片,Picasso也可以载入本地图片资源:
Picasso.with(context).load(R.drawable.icon).into(imageView);
Picasso.with(context).load("file:///android_asset/Adnroid.png").into(imageView);
Picasso.wiht(context).load(new File(...)).into(imageView);
7.调试:为了方便调试,你可以通过调用Picasso的setIndicatiorEnabled(true);可以让不同来源的图片显示一个不同的色彩标记;
以上的内容已经够多了,限于篇幅就把Picasso的练习Demo放到下篇文章吧!
总结:
是不是觉得Picasso的使用很简单了,如果应用中需要获取和显示大量的图片数据,何不考虑使用Picasso一下呢。来做个Demo感受下:Android 获取并显示远程图片 Picasso框架的使用(二)
参考资料:
Sending and Managing Network Requests
- 微博: @明桑Android黑历史
- 邮箱: <13141459344@163.com>
- 个人主页: 明桑战胜Android汪的黑历史
-
微信公众号: ITBird