天天看点

浅谈Volley网络框架(三)

上两篇文章都介绍的是请求网络数据,这篇文章介绍一下,利用Volley和图片打交道。

ImageRequest的使用

细心的你一定会发现,凡是对象名称后面跟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);

            }
        }, , , 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对象操作图片是不够的,它还为我们提供了其他的对象

ImageLoader的用法

看名字虽然他不是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, , );
           

第一行仍然是创建请求队列

第二行创建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 =  *  * ;  
        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);  
    }  
}  
           

自定义控件-NetworkImageView

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!

继续阅读