Volley简单学习使用一

一、简介:
     Volley Github地址:https://github.com/mcxiaoke/android-volley  
Volley可是说是把AsyncHttpClient和Universal-Image-Loader的优点集于了一身,既可以像AsyncHttpClient一样非常简单地进行HTTP通信,也可以像Universal-Image-Loader一样轻松加载网络上的图片。除了简单易用之外,Volley在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕。
    Volley应该是简化了网络通信的一些开发,特别是针对以下两种情况:
  • JSON对象
  • 图片加载

二、简单使用:
(一)简单的GET请求,返回数据类型为String
1、记得添加网络权限
    <uses-permission android:name="android.permission.INTERNET"/>
2、简单使用流程
    private RequestQueue mRequestQueue;
    //创建一个RequestQueue
    mRequestQueue = Volley.newRequestQueue(this);
       
    //创建一个StringRequest---GET请求
    String url = "http://www.baidu.com";
    StringRequest stringRequest = new StringRequest(url,
    new Response.Listener<String>() {
        @Override
        public void onResponse(String response) {
            Log.d(TAG, response);
        }
    },
    new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.e(TAG, error.getMessage());
        }
    });
       
    //将StringRequest对象添加到RequestQueue
    mRequestQueue.add(stringRequest);
3、结果将会得到一串Html源码字符串

(二)简单的JSON GET请求,方法同上类似,这里使用另一个Request构造函数
    String jsonurl = "http://pipes.yahooapis.com/pipes/pipe.run?_id=giWz8Vc33BG6rQEQo_NLYQ&_render=json";
    Response.Listener<JSONObject> listener = new Response.Listener<JSONObject>() {
        @Override
        public void onResponse(JSONObject response) {
            Log.i(TAG, response.toString());
        }
    };
   
    Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            Log.i(TAG, error.getMessage());
        }
    };
 
    JsonObjectRequest jr = new JsonObjectRequest(Request.Method.GET, jsonurl, null, listener, errorListener);
    mRequestQueue.add(jr);
(三)简单的POST请求
    JsonObjectRequest postRequest = new JsonObjectRequest(Request.Method.POST, jsonurl,  null, listener, errorListener) { 
       
        //将Post的参数写入到map中
        @Override 
        protected Map<String, String> getParams() throws AuthFailureError { 
            Map<String, String> map = new HashMap<String, String>(); 
            map.put("params1", "value1"); 
            map.put("params2", "value2"); 
            return map; 
        } 
    }; 
    mRequestQueue.add(postRequest);
三、加载图片方法使用
(一)使用ImageRequest来实现,流程同上类似
    String imageUrl = "http://a.hiphotos.baidu.com/image/pic/item/3801213fb80e7bec5cfb43e02d2eb9389b506b89.jpg";
    int max_width  = 300;
    int max_height = 300;
    Response.Listener<Bitmap> listener = new Response.Listener<Bitmap>() {
        @Override
        public void onResponse(Bitmap response) {
            myImageView.setImageBitmap(response);
        }
    };
   
    Response.ErrorListener errorListener = new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            myImageView.setImageResource(R.drawable.default_pg);
        }
    };
   
    ImageRequest imageRequest = new ImageRequest(imageUrl, listener, max_width, max_height, Config.RGB_565, errorListener);
    mRequestQueue.add(imageRequest);
其中,ImageRequest中的参数意义分别为:
    * @param url URL of the image
    * @param listener Listener to receive the decoded bitmap
    * @param maxWidth Maximum width to decode this bitmap to, or zero for none
    * @param maxHeight Maximum height to decode this bitmap to, or zero for
    *            none
    * @param decodeConfig Format to decode the bitmap to
    * @param errorListener Error listener, or null to ignore errors
注:1、maxWidth,maxHeight指最大的图片宽高,图片超过该尺寸则会进行压缩;若设为0,则不进行压缩直接加载;
      2、decodeConfig图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。

(二)使用ImageLoader来实现
     ImageLoader也可以用于加载网络上的图片,并且它的内部也是使用ImageRequest来实现的,不过ImageLoader明显要比ImageRequest更加高效,因为它不仅可以帮我们对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。
    //第一步创建RequestQueue,前面已经创建,这里不再重复创建
    String imageUrl = "http://a.hiphotos.baidu.com/image/pic/item/3801213fb80e7bec5cfb43e02d2eb9389b506b89.jpg";
   
    //创建LruCache保存下载过的图片
    final LruCache<String, Bitmap> mImageLruCache = new LruCache<String, Bitmap>(20);
   
    //创建ImageCache,供后面使用
    ImageCache imageCache = new ImageCache() {
        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            mImageLruCache.put(url, bitmap);
        }
       
        @Override
        public Bitmap getBitmap(String url) {
            return mImageLruCache.get(url);
        }
    };
   
    //创建ImageLoader
    ImageLoader imageLoader = new ImageLoader(mRequestQueue, imageCache);
   
    /**
     * @param imageView The imageView that the listener is associated with.
     * @param defaultImageResId Default image resource ID to use, or 0 if it doesn't exist.
     * @param errorImageResId Error image resource ID to use, or 0 if it doesn't exist.
     */
    //获取一个ImageListener对象
    ImageListener imageListener = ImageLoader.getImageListener(myImageView, R.drawable.default_pg, R.drawable.failed_pg);
   
    //调用ImageLoader的get()方法加载网络上的图片
    imageLoader.get(imageUrl, imageListener);
   
    //如果想对加载图片大小进行限定,使用get()的另一个重载方式
    imageLoader.get(imageUrl, imageListener, 300, 300);
    ImageLoader能够提供的一个比较好的实践就是能够提供图片缓存,这里通过LruCache来实现,最大缓存的图片数目为20张;我们也可以自定义最大缓存图片的内存大小,如下所示:
    final LruCache<String, Bitmap> mImageLruCache = new LruCache<String, Bitmap>(maxSize){
        @Override
        protected int sizeOf(String url, Bitmap bitmap){
            return bitmap.getRowBytes() * bitmap.getHeight();
        }
    };
   
    ImageCache imageCache = new ImageCache() {
        @Override
        public void putBitmap(String url, Bitmap bitmap) {
            mImageLruCache.put(url, bitmap);
        }
       
        @Override
        public Bitmap getBitmap(String url) {
            return mImageLruCache.get(url);
        }
    };
这样创建了一个最大缓存大小为10M,策略为LRU的LruCache。
(三)使用NetworkImageView的方法
1、首先在XML布局中使用该控件
    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/myNetworkImageView"
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:contentDescription="@string/hello_world"
        />
    下载后的图片会根据width和height大小进行压缩,如果不想压缩图片,可以使用wrap content
2、然后代码中使用NetworkImageView
    //前面创建ImageLoader与前面相同,不再重复创建
    //使用NetworkImageView
    NetworkImageView imageView = (NetworkImageView) findViewById(R.id.myNetworkImageView);
    imageView.setDefaultImageResId(R.drawable.default_pg);
    imageView.setErrorImageResId(R.drawable.failed_pg);
    imageView.setImageUrl(imageUrl, imageLoader);

你可能感兴趣的:(Volley简单学习使用一)