Android开源:网络框架volley使用(一)---使用方法笔记

1.Get方法获取字符串:

    public void loadGetJson(String url)
    {
        //创建RequestQueue对象,一个activity创建一个对象即可
        RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
        //创建get方法的json请求对象
        StringRequest sr = new StringRequest(url, new Listener<String>()
        {
            @Override
            public void onResponse(String response)
            {
                Log.e("onResponse", "" + response);
            }
        }, new ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Log.e("onErrorResponse", "" + error.toString());
            }
        });
        //将请求对象加入到请求队列里
        mQueue.add(sr);
    }



2.指定get或者post方法获取字符串

(1)get方法

RequestQueue requestQueue = Volley.newRequestQueue(this);
                StringRequest sRequest=new StringRequest(Request.Method.GET,CITY_CODE_URL, new Listener<String>() {
                        @Override
                        public void onResponse(String response) {
                                System.out.println(response);                               
                        }
                }, new Response.ErrorListener() {
                        @Override
                        public void onErrorResponse(VolleyError arg0) {
                                System.out.println("sorry,Error");
                        }
                });
                sRequest.setShouldCache(false);
                requestQueue.add(sRequest);


(2)post方法

StringRequest中并没有提供设置POST参数的方法,但是当发出POST请求的时候,Volley会尝试调用StringRequest的父类——Request中的getParams()方法来获取POST参数,那么解决方法自然也就有了,我们只需要在StringRequest的匿名类中重写getParams()方法,在这里设置POST参数就可以了,代码如下所示:

StringRequest stringRequest = new StringRequest(Method.POST, url,  listener, errorListener) {
	@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;
	}
};


完整范例如下:

    public void loadPostLogin(String url)
    {
        RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
        StringRequest sr = new StringRequest(Request.Method.POST, url, new Listener<String>()
        {
            @Override
            public void onResponse(String response)
            {
                Log.e("onResponse", "" + response);
            }
        }, new ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Log.e("onErrorResponse", "" + error.toString());
            }
        })
        {
            @Override
            protected Map<String, String> getParams() throws AuthFailureError
            {
                Map<String, String> map = new HashMap<String, String>();  
                map.put("UserName", "glblong");  
                map.put("PassWord", "123456"); 
                return map;
            }
        };
        mQueue.add(sr);
    }


3.JsonObjectRequest和JsonArrayRequest用法与StringRequest一致,方法如下:

第二个参数说明:

Constructor which defaults to GET if jsonRequest is null, POST otherwise.

默认情况下设成null为get方法,否则为post方法。


        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(url, null, new Response.Listener<JSONObject>()
        {
            @Override
            public void onResponse(JSONObject response)
            {
                Log.d("TAG", response.toString());
            }
        }, new Response.ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                Log.e("TAG", error.getMessage(), error);
            }
        });


4.ImageRequest用法

    /**
     * 第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,
     * 指定成0的话就表示不管图片有多大,都不会进行压缩。
     * 
     * @param url
     *            图片地址
     * @param listener
     * @param maxWidth
     *            指定允许图片最大的宽度
     * @param maxHeight
     *            指定允许图片最大的高度
     * @param decodeConfig
     *            指定图片的颜色属性,Bitmap.Config下的几个常量.
     * @param errorListener
     */
    public void getImgRequest(final ImageView iv, String url)
    {
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        ImageRequest ir = new ImageRequest(url, new Listener<Bitmap>()
        {
            public void onResponse(Bitmap response)
            {
                iv.setImageBitmap(response);
            };
        }, 0, 0, Config.RGB_565, new ErrorListener()
        {
            @Override
            public void onErrorResponse(VolleyError error)
            {
                // TODO Auto-generated method stub
                
            }
        });
        queue.add(ir);
    }


5. ImageLoader用法

ImageLoader比ImageRequest更加高效,因为它不仅对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

        //1.创建RequestQueue实例
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        //2.创建ImageLoader实例,ImageCache需要重写才能实现缓存
        ImageLoader il = new ImageLoader(queue, new ImageCache()
        {
            @Override
            public void putBitmap(String url, Bitmap bitmap)
            {
                // TODO Auto-generated method stub
            }
            @Override
            public Bitmap getBitmap(String url)
            {
                // TODO Auto-generated method stub
                return null;
            }
        });
        //3.创建ImageListener实例,设置默认图片和加载失败图片
        ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.img_loading, R.drawable.img_failed);
        //4.通过get方法加载图片
        il.get(url, listener);


使用范例代码如下:

(1)先实现ImageCache接口

import android.graphics.Bitmap;
import android.support.v4.util.LruCache;

import com.android.volley.toolbox.ImageLoader.ImageCache;

public class ImageLoaderCache implements ImageCache
{
    private LruCache<String, Bitmap> mCache;
    
    public ImageLoaderCache()
    {
        int maxSize = 10 * 1024 * 1024;//设置缓存图片的大小为10M
        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);
    }
}


(2)使用方法如下:

    public void getImgLoader(ImageView iv,String url)
    {
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        ImageLoader il = new ImageLoader(queue, new ImageLoaderCache());
        ImageListener listener = ImageLoader.getImageListener(iv, R.drawable.img_loading, R.drawable.img_failed);
        //加载并限定图片宽度和高度
        il.get(url, listener, 200, 300);
    }


6.NetworkImageView的用法

NetworkImageView在加载图片的时候会自动获取自身控件的宽高,然后对比网络图片的宽度,再决定是否需要对图片进行压缩。也就是说,压缩过程是在内部完全自动化的,并不需要我们关心,NetworkImageView会始终呈现给我们一张大小刚刚好的网络图片,不会多占用任何一点内存。


如果不想对图片进行压缩的话,只需要在布局文件中把NetworkImageView的layout_width和layout_height都设置成wrap_content就可以了,这样NetworkImageView就会将该图片的原始大小展示出来,不会进行任何压缩。


(1)布局文件中添加NetworkImageView控件

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView1"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="60dp"
        android:src="@drawable/ic_launcher" />

2.代码实现

        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        ImageLoader p_w_picpathLoader = new ImageLoader(queue, new ImageLoaderCache());
        
        NetworkImageView niv = (NetworkImageView) findViewById(R.id.networkImageView1);
        
        niv.setDefaultImageResId(R.drawable.img_loading);
        niv.setErrorImageResId(R.drawable.img_failed);
        niv.setImageUrl(url, p_w_picpathLoader);


7.取消请求

Volley提供了强大的API取消未处理或正在处理的请求。取消请求最简单的方法是调用请求队列cancelAll(tag)的方法,前提是你在添加请求时设置了标记。这样就能使标签标记的请求挂起。


给请求设置标签:

request.setTag("My Tag");


使用ApplicationController添加使用了标签的请求到队列中:

ApplicationController.getInstance().addToRequestQueue(request, "My Tag");


取消所有指定标记的请求:

mRequestQueue.cancelAll("My Tag");





参考:

  1. Android开源:网络框架volley使用(一)---使用方法笔记

  2. Android开源:网络框架volley使用(二)---框架的自定义改造

  3. Asynchronous HTTP Requests in Android Using Volley