我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率非常高。
不过HttpURLConnection和HttpClient的用法还是稍微有些复杂的,如果不进行适当封装的话,很容易就会写出不少重复代码。于是乎,一些Android网络通信框架也就应运而生,比如说AsyncHttpClient,它把HTTP所有的通信细节全部封装在了内部,我们只需要简单调用几行代码就可以完成通信操作了。再比如Universal-Image-Loader,它使得在界面上显示网络图片的操作变得极度简单,开发者不用关心如何从网络上获取图片,也不用关心开启线程、回收图片资源等细节,Universal-Image-Loader已经把一切都做好了。
Android开发团队也是意识到了有必要将HTTP的通信操作再进行简单化,于是在2013年Google I/O大会上推出了一个新的网络通信框架——Volley。Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
关于加载图片的用法
ImageRequest:
ImageRequest ir = new ImageRequest(url, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap arg0) {
mIv.setImageBitmap(arg0);
}//0,0表示显示原图
}, 0, 0, Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError arg0) {
mIv.setImageResource(R.drawable.ic_launcher);
}
});
MyApplication.getQueues().add(ir);
}
ImageLoader+缓存
ImageLoader loader = new ImageLoader(MyApplication.getQueues(), new BitmapCache());
ImageListener listener = ImageLoader.getImageListener(mIv, R.drawable.ic_launcher, R.drawable.ic_launcher);
loader.get(url, listener);
缓存类
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> cache;
private int max = 10 * 1024 * 1024;
public BitmapCache() {
cache = new LruCache<String, Bitmap>(max) {
@Override
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes() * value.getHeight();
}
};
}
@Override
public Bitmap getBitmap(String arg0) {
return cache.get(arg0);
}
@Override
public void putBitmap(String arg0, Bitmap arg1) {
cache.put(arg0, arg1);
}
}
使用ImageLoader+缓存+NetworkImageView
ImageLoader loader = new ImageLoader(MyApplication.getQueues(), new BitmapCache());
mNIv.setDefaultImageResId(R.drawable.ic_launcher);
mNIv.setErrorImageResId(R.drawable.ic_launcher);
mNIv.setImageUrl(url, loader);