上一篇我们已经说过了加载网络图片的一个方法,ImageRequest,使用起来很简单,但是接下来我要说更加高效,更加有用的一些方
法。
一:ImageLoader的使用
imageLoader内部也是基于ImageRequest的,但是,相对于ImageRequest来说,他高效在哪里?它能够对请求的图片进行缓存,并且
会帮我们过滤掉重复的链接请求。
imageLoader不是继承自Request的,因此使用方法和上一篇所讲的三个不相同。
imageLoader分四步走:
1)创建一个RequestQueue对象(请求队列)
2)创建一个ImageLoader对象
3)创建一个ImageListener对象
3)调用ImageLoader的get()方法来加载网络图片
RequestQueue queue = Volley.newRequestQueue(context);//第一步
ImageLoader loader = new ImageLoader(queue, new ImageCache() {//第二步
@Override
public void putBitmap(String url, Bitmap bitmap) {
// TODO Auto-generated method stub
}
@Override
public Bitmap getBitmap(String url) {
// TODO Auto-generated method stub
return null;
}
});
ImageListener listener = ImageLoader.getImageListener(imageView, //第三步
R.drawable.a1, R.drawable.a2);
loader.get("http://inews.gtimg.com/newsapp_ls/0/276901406/0", listener,200,200);//第四步
第二步中,ImageLoader里面的参数,第一个是请求队列,第二个是对图像进行缓存的imageCache对象。
第三步中,ImageLoader.getImageListener中的参数,第一个是用于显示图片的控件,第二个是加载过程中显示的图片,第三个是加
载失败显示的图片。
第四步中,第一个参数是通信的url地址,第二个是ImageListener对象,第三个第四个是指定图片的宽度高度(非必须)
详细说一下第二步,ImageLoader和ImageRequest不同的地方开始的时候说了,ImageLoader能够缓存图片,而缓存就是在第二步中完成的,
缓存图片,我们可以结合ImageCache接口和Android提供的LruCache功能,我们可以新建一个类去实现ImageCache接口,在这个类中结合LruCache
实现缓冲逻辑就行了。
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
public BitmapCache() {
int maxSize = 5 * 1024 * 1024; //设置缓存区大小,这里为5M
mCache = new LruCache<String, Bitmap>(maxSize) {
@Override
protected int sizeOf(String key, Bitmap bitmap) {
return bitmap.getRowBytes() * bitmap.getHeight(); //返回图片内存大小
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url); //通过键来 获得缓存区对应的图片
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap); //通过键值对方式把图片存入缓存区
}
}
每一步代码中都有注释,就不说了,不过sizeof方法中返回图片内存大小还是要说明一下
getRowBytes:用于计算位图每一行所占用的内存字节数
getByteCount:用于计算位图所占用的内存字节数
getByteCount() = getRowBytes() * getHeight() 也就是说位图所占用的内存空间数等于位图的每一行所占用的空间数乘以位图的行数。
那是使用上述代码中的getRowBytes() * getHeight()还是使用getByteCount() 呢?这就要看项目的sdk等级。
建议:api12级之后使用getByteCount()
接着更改一下第二步
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
ImageLoader就是这样使用的。
二:NetWorkImageView的使用
netWorkImageView的使用分五步走:
1)创建一个RequestQueue对象(请求队列)
2)创建一个ImageLoader对象
3)在xml中创建netWorkImageView控件
4)在代码中获得netWorkImageView的实例
5)设置加载的url
public class MainActivity extends Activity {
private RequestQueue mQueue;//第一步
private NetworkImageView networkImageView;
private Button btn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
networkImageView = (NetworkImageView) findViewById(R.id.netWorkImageViewId);
btn = (Button) findViewById(R.id.btn);
btn.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
mQueue = Volley.newRequestQueue(getApplicationContext());
ImageLoader loader = new ImageLoader(mQueue, new BitmapCache());
networkImageView.setDefaultImageResId(R.drawable.default_image); //设置加载时的图片
networkImageView.setErrorImageResId(R.drawable.failed_image); //设置加载失败的图片
networkImageView.setImageUrl("http://inews.gtimg.com/newsapp_ls/0/276901406/0", loader);//第五步
}
});
}
相对不同的是,ImageRequest和ImageLoader是在代码中设置压缩图片的大小,而
netWorkImageView是一个view控件,在xml中就
已经设置好了大小,因此它会返回我们刚刚好大小的图片。
总结:
图片的加载方法就已经说完了,在讲到缓冲图片那一块时,其实可以讲解得很深入,会讲到对象的强应用和弱应用还有垃圾回收机
制,这些需要慢慢去深入了解。
最重要的是,记住有多少种方法,每种方法几步走。