前面分享了Volley用于一般网络数据请求的方法,http://blog.csdn.net/swjtufq/article/details/52636361
今天来说一下Volley用于网络图片的请求,首先来看ImageRequest,这个跟之前的StringRequest很类似,代码如下:

RequestQueue requestQueue = Volley.newRequestQueue(this);ImageRequest imageRequest = new ImageRequest("网络图片地址", new Response.Listener() {            @Override            public void onResponse(Bitmap response) {            }            @Override            public void onResponseHeaders(Map headers) {            }        }, 100, 100, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {            }        });requestQueue.add(imageRequest);

也是先定义一个RequestQueue ,然后定义ImageRequest,第一个参数就是网络图片的加载地址,第二个参数是成功返回的结果,第三和第四个参数是指定图片压缩的大小,如果是0,0就是保持原来的图片大小,不压缩,第五个参数是返回错误的结果,然后加入到RequestQueue 中,很简单吧,接下来我们来看下Volley提供的更加强大的ImageLoader,ImageLoader内部也是调用的ImageRequest,但是增加了比如默认的图片,错误的图片,还有缓存等等,看如下代码:

RequestQueue requestQueue1 = Volley.newRequestQueue(this);ImageLoader imageLoader = new ImageLoader(requestQueue1, new BitmapCache());ImageLoader.ImageListener listener = ImageLoader.getImageListener(imageView,                R.drawable.default_image, R.drawable.failed_image);imageLoader.get("网络图片地址",listener);

依然是先定义一个RequestQueue ,然后定义ImageLoader ,第一个参数就是刚才定义的RequestQueue ,第二个参数是一个ImageCache缓存类,这个待会再说,然后定义了一个ImageListener ,这个ImageListener 第一个参数是我们要设置的图片view,第二个参数是默认加载的图片,第三个参数是当发生错误时加载的图片,我在上一篇文章中分享过图片缓存的方式,http://blog.csdn.net/swjtufq/article/details/52651084,下面我们就在ImageCache中把LruCache缓存的方式用上,代码如下:

class BitmapCache implements ImageLoader.ImageCache{        private LruCache mMemoryCache;        public BitmapCache(){            int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024);            int cacheSize = maxMemory / 8;            mMemoryCache = new LruCache(cacheSize) {                @Override                protected int sizeOf(String key, Bitmap bitmap) {                    return bitmap.getRowBytes() * bitmap.getHeight() / 1024;                }            };        }        @Override        public Bitmap getBitmap(String url) {            String key = hashKeyFormUrl(url);            return mMemoryCache.get(key);        }        @Override        public void putBitmap(String url, Bitmap bitmap) {            String key = hashKeyFormUrl(url);            mMemoryCache.put(key,bitmap);        }        private String hashKeyFormUrl(String url) {            String cacheKey;            try {                final MessageDigest mDigest = MessageDigest.getInstance("MD5");                mDigest.update(url.getBytes());                cacheKey = bytesToHexString(mDigest.digest());            } catch (NoSuchAlgorithmException e) {                cacheKey = String.valueOf(url.hashCode());            }            return cacheKey;        }        private String bytesToHexString(byte[] bytes) {            StringBuilder sb = new StringBuilder();            for (int i = 0; i < bytes.length; i++) {                String hex = Integer.toHexString(0xFF & bytes[i]);                if (hex.length() == 1) {                    sb.append('0');                }                sb.append(hex);            }            return sb.toString();        }    }

相信看过我上一篇文章的,应该对这段代码很熟悉了,这里就不说了, 当然读者可以自己扩展,把DisLruCache也加入进去,多一层文件缓存,接下来看Volley提供的另外一个加载图片类NetworkImageView,这个类继承于ImageView,是一个控件,所以在使用的时候先写在布局文件中:

<?xml version="1.0" encoding="utf-8"?><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"    tools:context="com.fq.volleytest.MainActivity">    <com.android.volley.toolbox.NetworkImageView    android:id="@+id/network_image"    android:layout_width="100dp"    android:layout_height="100dp"    />RelativeLayout>
NetworkImageView networkImageView;networkImageView = (networkImageView)findViewById(R.id.network_image);RequestQueue requestQueue1 = Volley.newRequestQueue(this);ImageLoader imageLoader = new ImageLoader(requestQueue1, new BitmapCache());networkImageView.setDefaultImageResId(R.drawable.default_image);networkImageView.setErrorImageResId(R.drawable.failed_image);networkImageView.setImageUrl("网络图片地址",imageLoader);

这个类也是依赖于ImageLoader,所以要先定义一个ImageLoader,只是不需要ImageListener了,因为NetworkImageView 可以自己设定默认图片,和失败的图片,最后调用setImageUrl加载网络图片,好了,Volley加载网络图片就介绍到这里,如有问题,欢迎指正,谢谢。

更多相关文章

  1. 自定义控件--带动画的CheckBox
  2. 自定义RatingBar/SeekBar,重载样式
  3. Android(安卓)常用控件自定义样式RadioButton、CheckBox、Progre
  4. Android之使用Http协议实现文件上传功能
  5. android中listView实现异步加载网络图片
  6. Android(安卓)列表使用(ListView GridView Gallery图片计时滚动)
  7. FaceBook推出的Android图片加载库-Fresco
  8. Android(安卓)Studio 图片资源存放位置 + drawable文件夹的创建
  9. [android] 构建menu的一种方法

随机推荐

  1. android 实现由下至上弹出并位于屏幕底部
  2. Android(安卓)分享一个流量显示界面
  3. Android画虚线
  4. android 内存优化
  5. Android(安卓)Fastboot源码分析
  6. Android: Intent.ACTION_SEND分享文件
  7. Android对Window对象的管理机制分析
  8. Android(安卓)图片缩放
  9. Android(安卓)ContentObserver ---拦截短
  10. Android(安卓)Bootloader - Main system