上两篇文章都介绍的是请求网络数据,这篇文章介绍一下,利用Volley和图片打交道。
细心的你一定会发现,凡是对象名称后面跟Request的,都是继承了Request这个抽象类,那么ImageRequest也继承自Request。如果你学会了StringRequest和JsonRequest,那这个ImageReqeust用法也是一样,因为他们都是一个爹嘛!看如下代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" tools:context="com.example.mydemo.MainActivity" >
<ImageView android:id="@+id/imageView_show" android:layout_width="wrap_content" android:layout_height="wrap_content"/>
</RelativeLayout>
这就是一个用于显示图片的布局,一会用于将请求拿到的图片设置上。下面的代码才是ImageRequest的用法
//请求队列
RequestQueue queues = Volley.newRequestQueue(MainActivity.this);
//请求地址
String url = "http://u.thsi.cn/fileupload/data/Input/2012/12/26/d72ea3717426e00fc5f2b745ba800fd7.jpg";
//开始请求
ImageRequest imageRequest = new ImageRequest(url, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
ImageView imageView = (ImageView)findViewById(R.id.imageView_show);
imageView.setImageBitmap(response);
}
}, 0, 0, Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
//请求失败!
}
});
//添加到队列中去
queues.add(imageRequest);
这里的创建RequestQueue和add就不用说了,我们就一起看一下ImageRequest,可见用法都是一样,但是参数有变化
参数一:你一看就知道了,URL服务器地址,这个一定要放图片的URL,不然就不会正常显示了
参数二:请求成功的回调函数,这个得到的结果是一个Bitmap,我在布局中写了一个ImageView,利用setImageBitmap将请求的图片设置上去
参数三和参数四:设置图片的最大宽度和高度,如果写0,0就代表任他放纵,不管图片多大,都不会进行压缩
参数五:指定图片的颜色属性,这里Bitmap.Config类提供了4种,其中ARGB_8888的颜色质量是最高的,但是他的像素占用的字节大小比例是
1px : 4byte是RGB_565的两倍。
参数六:请求失败的回调函数
这样,利用ImageRequest来请求网络图片就OK了。你一定觉得特别简单吧?还没完!Volley中单独的ImageRequest对象操作图片是不够的,它还为我们提供了其他的对象
看名字虽然他不是Request的儿子,但是用法也是不难。他的好处在于对对图片进行缓存,还可以过滤掉重复的链接。
四行代码帮你搞定
RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
ImageListener listener = ImageLoader.getImageListener(imageView, R.drawable.ic_launcher, R.drawable.ic_launcher);
imageLoader.get("http://www.lcxw.cn/d/file/news/yule/tupian/2016-03-03/fddc8014b90136bb9efcd1c6cdc5c7d7.jpg", listener, 1000, 1000);
第一行仍然是创建请求队列
第二行创建ImageLoader对象,参数一是放一个请求队列,参数二放一个缓存对象,这个缓存类最后我会写上
第三行创建ImageListener对象,这个参数分别是设置图片的显示位置、加载中显示的图片、请求失败显示的图片
最后一行是用ImageLoader通过get方法,指明图片的URL,还有刚刚创建好的ImageListener,最后1000,1000代表图片最大宽高,如不限制,就不用写。
缓存类,BitmapChache
public class BitmapCache implements ImageCache {
private LruCache<String, Bitmap> mCache;
@SuppressLint("NewApi")
public BitmapCache()
{
int maxSize = 10 * 1024 * 1024;
mCache = new LruCache<String, Bitmap>(maxSize)
{
@Override
protected int sizeOf(String key, Bitmap bitmap)
{
return bitmap.getRowBytes() * bitmap.getHeight();
}
};
}
@SuppressLint("NewApi")
@Override
public Bitmap getBitmap(String url)
{
return mCache.get(url);
}
@SuppressLint("NewApi")
@Override
public void putBitmap(String url, Bitmap bitmap)
{
mCache.put(url, bitmap);
}
}
Volley还提供了一个控件,叫NetwordImageView,用法也是非常简单了。直接上代码,一看就会。
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/imageView_show"
android:layout_width="200dp"
android:layout_height="200dp">
</com.android.volley.toolbox.NetworkImageView>
这是布局文件,用法和ImageView一样,下面是设置这个布局中控件的代码,findViewById我就不写了
/*1*/RequestQueue mQueue = Volley.newRequestQueue(MainActivity.this);
/*2*/ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());
/*3*/networkImageView.setDefaultImageResId(R.drawable.ic_launcher);
/*4*/networkImageView.setErrorImageResId(R.drawable.ic_launcher);
/*5*/networkImageView.setImageUrl("http://b.hiphotos.baidu.com/image/pic/item/08f790529822720ea5d058ba7ccb0a46f21fab50.jpg",imageLoader);
第一行和第二行你让我说我也不想说了,和介绍ImageLoader用法是一样的。第三行是设置默认图片,第四行是设置加载错误图片,最后一行是设置图片地址和ImageLoader对象。
到这里,Volley网络框架的使用就全局介绍完了。如果有什么不懂的或者有意见建议的,欢迎QQ骚扰或博客留言,997797281!