ImageLoader功能就要强大一些,它可以对图片进行缓存,其实它内部还是通过ImageRequest来实现的;通过ImageLoader.get(url,listener,maxWidth,maxHeight)自动获取图片;如果需要详细的监听图片的获取过程,则new一个ImageListener实例,如果不需要,则通过ImageLoader.getImageListener(int defaultResouceId,int errorResourceId);来设置默认的图片和请求失败时的图片;
在创建ImageLoader实例的时候,需要一个ImageCache对象,我在这里简单自定义了一个ImageCache对象用于缓存图片;
public class BitmapCache implements ImageCache { public static int getDefaultLruCacheSize() { final int maxMemory = (int) (Runtime.getRuntime().maxMemory() / 1024); final int cacheSize = maxMemory / 8; return cacheSize; } private final String tag = "BitmapCache"; private LruCache<String, Bitmap> mCache; public BitmapCache() { int maxSize = getDefaultLruCacheSize(); 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) { Log.e(tag, "getBitmap"); return mCache.get(url); } @Override public void putBitmap(String url, Bitmap bitmap) { Log.e(tag, "putBitmap"); mCache.put(url, bitmap); } }
五、NetworkImageView
protected void networkImageView() { String url = "http://img0.bdstatic.com/img/image/shouye/hjxnzz04.jpg"; NetworkImageView niv = ...; niv.setErrorImageResId(R.drawable.ic_launcher); niv.setDefaultImageResId(R.drawable.ic_launcher); ImageLoader loader = new ImageLoader(reqQueue, new BitmapCache()); niv.setImageUrl(url, loader); // NetworkImageView是一个自定义控制,它是继承自ImageView的,在原生的基础之上加入了加载网络图片的功能 // 使用ImageRequest和ImageLoader这两种方式来加载网络图片,都可以传入一个最大宽度和高度的参数来对图片进行压缩, // 但NetworkImageView并不需要提供任何设置最大宽高的方法也能够对加载的图片进行压缩. // 这是由于NetworkImageView是一个控件,在加载图片的时候它会自动获取自身的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩. // 也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片. }
NetworkImageView继承处ImageView,它的使用更加简单,它的一些特性上面已经列出,使用的时候直接把原始的ImageView替换即可;
六、补充
上面讲了几个常用的类的使用,下面对一些设置进行补充记录一下;
上面的网络请求都是最基本的请求,并没有带特定的参数,那么问题来了,如果我需要设定一些请求参数怎么办?请看下面!
Request在发出请求的时候,会调用两个方法getParams和getHeaders,分别读取请求时附带的参数和请求头,我们重写这两方法,把需要设置的参数给写进去即可,下面是一个简单的例子;
StringRequest sr = new StringRequest(Method.GET, url, new Listener<String>() { @Override public void onResponse(String response) { Log.e(tag, "" + response); } }, new ErrorListener() { @Override public void onErrorResponse(VolleyError error) { } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> map = new HashMap<String, String>(); map.put("param1", "value1"); map.put("param2", "value2"); return map; } @Override public Map<String, String> getHeaders() throws AuthFailureError { Map<String, String> map = new HashMap<String, String>(); map.put("Content-Type", "application/json"); return map; } };
七、管理缓存