Volley加载图片可以通过三种方式:ImageRequest、ImageLoader、NetworkImageView
直接上代码,使用说明见注释:
第一步 搭建环境
下载jar包,新建工程,导入volley.jar
第二步 AndroidManifest.xml 文件
打开网络权限 (<uses-permission android:name="android.permission.INTERNET" />)
引入MyApplication (android:name="com.example.volleyfrademo.MyApplication")
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.example.volleyfrademo"
android:versionCode="1"
android:versionName="1.0" >
<uses-sdk
android:minSdkVersion="14"
android:targetSdkVersion="21" />
<uses-permission android:name="android.permission.INTERNET"/>
<application
android:allowBackup="true"
android:icon="@drawable/ic_launcher"
android:label="@string/app_name"
android:theme="@style/AppTheme"
android:name="com.example.volleyfrademo.MyApplication">
<activity
android:name=".<span style="font-family: Arial;">MainActivity</span>"
android:label="@string/app_name" >
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
</application>
</manifest>
第三步 MyApplication.java 文件
package com.example.volleyfrademo;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.VolleyLog;
import com.android.volley.toolbox.Volley;
import android.app.Application;
import android.text.TextUtils;
public class MyApplication extends Application {
public static final String TAG = "MyApplication";
private RequestQueue queues;
private static MyApplication instance;
@Override
public void onCreate() {
super.onCreate();
instance = this;
}
public static synchronized MyApplication getInstance() {
return instance;
}
public RequestQueue getRequestQueue(){
if (queues == null) {
queues = Volley.newRequestQueue(getApplicationContext());
}
return queues;
}
public <T> void addToRequestQueue(Request<T> req, String tag) {
req.setTag(TextUtils.isEmpty(tag) ? TAG : tag);
VolleyLog.d("Adding request to queue: %s", req.getUrl());
getRequestQueue().add(req);
}
public <T> void addToRequestQueue(Request<T> req) {
req.setTag(TAG);
getRequestQueue().add(req);
}
public void cancelPendingRequests(Object tag) {
if (queues != null) {
queues.cancelAll(tag);
}
}
}
第四步 activity_image.xml 文件
<LinearLayout 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:orientation="vertical"
tools:context="com.example.volleyfrademo.MainActivity" >
<ImageView
android:id="@+id/img_resp1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
<com.android.volley.toolbox.NetworkImageView
android:id="@+id/network_image_view"
android:layout_width="400dp"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal" />
<Button
android:id="@+id/btn_imagerequest"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过ImageRequest加载图片" />
<Button
android:id="@+id/btn_imageloader"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过ImageLoader加载图片,无缓存" />
<Button
android:id="@+id/btn_imageloader2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过ImageLoader加载图片,有缓存" />
<Button
android:id="@+id/btn_networkimageView"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过NetworkImageView加载图片,无缓存" />
<Button
android:id="@+id/btn_networkimageView2"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="通过NetworkImageView加载图片,有缓存" />
</LinearLayout>
第五步 ImageActivity.java文件
package com.example.volleyfrademo;
import com.android.volley.VolleyError;
import com.android.volley.Response.ErrorListener;
import com.android.volley.Response.Listener;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.ImageRequest;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.ImageLoader.ImageCache;
import com.android.volley.toolbox.ImageLoader.ImageListener;
import android.app.Activity;
import android.graphics.Bitmap;
import android.graphics.Bitmap.Config;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.Toast;
public class ImageActivity extends Activity implements OnClickListener{
private ImageView img_resp1;
private NetworkImageView networkImageView;
private Button btn_imagerequest, btn_imageloader, btn_imageloader2, btn_networkimageView, btn_networkimageView2;
private String urlImageRequest = "http://p2.so.qhimg.com/t01258fd340b7d71ab7.gif";
private String urlImageLoader = "http://img2.auyou.cn/grgl/hypic/200804/20084111205833137.jpg";
private String urlImageLoader2 = "http://img.qzone.la/uploads/allimg/111103/1-111103025922-50.jpg";
private String urlNetworkImageView = "http://att.bbs.duowan.com/forum/201309/07/160720kwxxsqlla4wjaxzs.jpg";
private String urlNetworkImageView2 = "http://img4.duitang.com/uploads/item/201404/19/20140419172144_AGZNk.thumb.224_0.jpeg";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_image);
initView();
setEvent();
}
private void initView() {
img_resp1 = (ImageView) findViewById(R.id.img_resp1);
networkImageView = (NetworkImageView) findViewById(R.id.network_image_view);
btn_imagerequest = (Button) findViewById(R.id.btn_imagerequest);
btn_imageloader = (Button) findViewById(R.id.btn_imageloader);
btn_imageloader2 = (Button) findViewById(R.id.btn_imageloader2);
btn_networkimageView = (Button) findViewById(R.id.btn_networkimageView);
btn_networkimageView2 = (Button) findViewById(R.id.btn_networkimageView2);
}
private void setEvent() {
btn_imagerequest.setOnClickListener(this);
btn_imageloader.setOnClickListener(this);
btn_imageloader2.setOnClickListener(this);
btn_networkimageView.setOnClickListener(this);
btn_networkimageView2.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch(v.getId()){
case R.id.btn_imagerequest:
volley_ImageRequest();
break;
case R.id.btn_imageloader:
volley_ImageLoader();
break;
case R.id.btn_imageloader2:
volley_ImageLoader2();
break;
case R.id.btn_networkimageView:
volley_NetworkImageView();
break;
case R.id.btn_networkimageView2:
volley_NetworkImageView2();
break;
}
}
/**
* ImageRequest 加载图片
* ImageRequest的构造函数接收六个参数:
* 第一个参数就是图片的URL地址,这个没什么需要解释的;
* 第二个参数是图片请求成功的回调,这里我们把返回的Bitmap参数设置到ImageView中;
* 第三第、四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,指定成0的话就表示不管图片有多大,都不会进行压缩;
* 第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小;
* 第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。
*/
private void volley_ImageRequest() {
ImageRequest request = new ImageRequest(urlImageRequest, new Listener<Bitmap>() {
@Override
public void onResponse(Bitmap response) {
img_resp1.setImageBitmap(response);
}
}, 0, 0, Config.RGB_565, new ErrorListener() {
@Override
public void onErrorResponse(VolleyError error) {
Toast.makeText(ImageActivity.this, error.toString(), 3000).show();
img_resp1.setImageResource(R.drawable.ic_launcher);
}
});
request.setTag("volley_ImageRequest");
MyApplication.getInstance().addToRequestQueue(request);
}
/**
* ImageLoader 加载图片,无缓存
*/
private void volley_ImageLoader(){
/*
* ImageLoader的构造函数接收两个参数:
* 第一个参数就是RequestQueue对象
* 第二个参数是一个ImageCache对象,这里我们先new出一个空的ImageCache的实现即可
*/
ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
@Override
public Bitmap getBitmap(String url) {
return null;
}
});
/*
* 我们通过调用ImageLoader的getImageListener()方法能够获取到一个ImageListener对象
* getImageListener()方法接收三个参数:
* 第一个参数指定用于显示图片的ImageView控件
* 第二个参数指定加载图片的过程中显示的图片
* 第三个参数指定加载图片失败的情况下显示的图片
*/
ImageListener listener = ImageLoader.getImageListener(img_resp1, R.drawable.ic_launcher, R.drawable.ic_launcher);
/*
* get()方法接收两个参数:
* 第一个参数就是图片的URL地址
* 第二个参数则是刚刚获取到的ImageListener对象。
* 当然,如果你想对图片的大小进行限制,也可以使用get()方法的重载,指定图片允许的最大宽度和高度 imgloader.get(url, listener, 200, 200)
*/
imgloader.get(urlImageLoader, listener);
}
/**
* ImageLoader 加载图片,有缓存
*/
private void volley_ImageLoader2(){
/*
* ImageLoader的构造函数接收两个参数:
* 第一个参数就是RequestQueue对象
* 第二个参数是一个ImageCache对象,这里我们先new出一个已经设置好的BitmapCache()
*/
ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new BitmapCache());
ImageListener listener = ImageLoader.getImageListener(img_resp1, R.drawable.ic_launcher, R.drawable.ic_launcher);
imgloader.get(urlImageLoader2, listener);
}
/**
* NetworkImageView 加载图片,无缓存,图片大小在xml中限制
*/
private void volley_NetworkImageView(){
//无缓存
ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new ImageCache() {
@Override
public void putBitmap(String url, Bitmap bitmap) {
}
@Override
public Bitmap getBitmap(String url) {
return null;
}
});
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setTag("volley_NetworkImageView");
networkImageView.setImageUrl(urlNetworkImageView, imgloader);
}
/**
* NetworkImageView 加载图片,有缓存,图片大小在xml中限制
*/
private void volley_NetworkImageView2() {
//有缓存
ImageLoader imgloader = new ImageLoader(MyApplication.getInstance().getRequestQueue(), new BitmapCache());
networkImageView.setDefaultImageResId(R.drawable.default_image);
networkImageView.setErrorImageResId(R.drawable.failed_image);
networkImageView.setTag("volley_NetworkImageView2");
networkImageView.setImageUrl(urlNetworkImageView2, imgloader);
}
}
第六步 BitmapCache.java
package com.example.volleyfrademo;
import android.graphics.Bitmap;
import android.util.LruCache;
import com.android.volley.toolbox.ImageLoader.ImageCache;
/**
* 对应volley_ImageLoader2
*
* 新建一个BitmapCache并实现了ImageCache接口
* 这里我们将缓存图片的大小设置为10M
*
* @author jiatao
*/
public class BitmapCache implements ImageCache{
private LruCache<String, Bitmap> mCache;
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();
}
};
}
@Override
public Bitmap getBitmap(String url) {
return mCache.get(url);
}
@Override
public void putBitmap(String url, Bitmap bitmap) {
mCache.put(url, bitmap);
}
}