在人生舞台上,从不给落伍者颁发奖牌。
本讲内容:Volley提供三种方式来加载网络图片
1、ImageRequest的用法
ImageRequest与StringRequest和JsonRequest类似,都是继承自Request的。
步骤都是:
1. 创建一个RequestQueue对象。
2. 创建一个Request对象。
3. 将Request对象添加到RequestQueue里面。
示例一:使用ImageRequest请求加载图片
下面是res/layout/activity_main.xml 布局文件:
<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" >
<ImageView
android:id="@+id/iv_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"/>
</RelativeLayout>
下面是app.java文件:
public class app extends Application{
public static RequestQueue queues;
public void onCreate() {
super.onCreate();
queues=Volley.newRequestQueue(getApplicationContext());
}
public static RequestQueue getHttpQueues(){
return queues;
}
}
下面是MainActivity.java界面文件:
public class MainActivity extends Activity {
private ImageView iv_img;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
String url="https://img-my.youkuaiyun.com/uploads/201309/01/1378037235_3453.jpg";
ImageRequest request=new ImageRequest(url, new Listener<Bitmap>() {
public void onResponse(Bitmap response) {
iv_img.setImageBitmap(response);
}
}, 0, 0, Config.RGB_565, new Response.ErrorListener() {
public void onErrorResponse(VolleyError error) {
iv_img.setBackgroundResource(R.drawable.ic_launcher);//加载失败时
}
});
app.getHttpQueues().add(request);
}
private void initView() {
iv_img = (ImageView) findViewById(R.id.iv_img);
}
}
可以看到,ImageRequest的构造函数接收六个参数,第一个参数就是图片的URL地址。第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中。第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩。第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。
运行程序:
2. ImageLoader的用法
由于ImageLoader不是继承自Request的,所以它的用法也有所不同,可以分为以下四步:
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 获取一个ImageListener对象。
4. 调用ImageLoader的get()方法加载网络上的图片。
public class MainActivity extends Activity {
private ImageView iv_img;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
String url="https://img-my.youkuaiyun.com/uploads/201309/01/1378037235_3453.jpg";
ImageLoader loader=new ImageLoader(app.getHttpQueues(), new BitmapCache());
ImageListener listener = ImageLoader.getImageListener(iv_img,R.drawable.ic_launcher,R.drawable.ic_launcher);
loader.get(url, listener);
}
private void initView() {
iv_img = (ImageView) findViewById(R.id.iv_img);
}
}
1、ImageLoader的构造函数接收两个参数,第一个参数就是RequestQueue对象,第二个参数是一个ImageCache对象,注意:如果ImageCache对象单独使用起不到缓存效果的。
2、调用ImageLoader的getImageListener()方法能够获取到一个ImageListener对象,getImageListener()方法接收三个参数,第一个参数指定用于显示图片的ImageView控件,第二个参数指定加载图片的过程中显示的图片,第三个参数指定加载图片失败的情况下显示的图片。
3、ImageLoader的et()方法接收两个参数,第一个参数就是图片的URL地址,第二个参数则是刚刚获取到的ImageListener对象。如果你想对图片的大小进行限制,也可以使用四个参数的get()方法,指定图片允许的最大宽度和高度
/**
* 缓存图片
*/
public class BitmapCache implements ImageCache {
public LruCache<String,Bitmap> cache;
public int maxSize=10*1024*1024;//缓存大小
public BitmapCache(){
cache=new LruCache<String, Bitmap>(maxSize){
protected int sizeOf(String key, Bitmap value) {
return value.getRowBytes()*value.getHeight();
}
};
}
public Bitmap getBitmap(String url) {
return cache.get(url);
}
public void putBitmap(String url, Bitmap bitmap) {
cache.put(url, bitmap);
}
}
运行程序:
3. NetworkImageView的用法
NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。NetworkImageView控件的用法要比前两种方式更加简单,大致可以分为以下五步:
1. 创建一个RequestQueue对象。
2. 创建一个ImageLoader对象。
3. 在布局文件中添加一个NetworkImageView控件。4. 在代码中获取该控件的实例。
5. 设置要加载的图片地址。
下面是MainActivity.java文件:
public class MainActivity extends Activity {
private NetworkImageView netImageView;
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();
String url="https://img-my.youkuaiyun.com/uploads/201309/01/1378037235_3453.jpg";
ImageLoader loader=new ImageLoader(app.getHttpQueues(), new BitmapCache());
netImageView.setDefaultImageResId(R.drawable.ic_launcher);
netImageView.setErrorImageResId(R.drawable.ic_launcher);
netImageView.setImageUrl(url, loader);
}
private void initView() {
netImageView=(NetworkImageView) findViewById(R.id.network_image_view);
}
}
1、setDefaultImageResId()方法、setErrorImageResId()方法和setImageUrl()方法来分别设置加载中显示的图片,加载失败时显示的图片,以及目标图片的URL地址。
2、setImageUrl()方法接收两个参数,第一个参数用于指定图片的URL地址,第二个参数则是前面创建好的ImageLoader对象。
运行程序
注意:
使用ImageRequest和ImageLoader这两种方式来加载网络图片,都可以传入一个最大宽度和高度的参数来对图片进行压缩,而NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩。这是由于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存,这也是NetworkImageView最简单好用的一点吧。如果你不想对图片进行压缩的话,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。