Android Volley网络请求框架

来源:互联网 发布:手机淘宝2015旧版5.7.2 编辑:程序博客网 时间:2024/05/09 12:48

虽然不是原创,但此文纯手写,喜欢请关注。个人学习笔记,请不要见笑。通过学习郭霖大神的http://blog.csdn.net/guolin_blog/article/details/17482095

加上自己的理解。


volley 下载:http://download.csdn.net/detail/sinyu890807/7152015 

在清单文件中添加权限:

  1. <uses-permission android:name="android.permission.INTERNET" />  

volley使用起来先要s声明RequestQueue,注意这里拿到的RequestQueue是一个请求队列对象,它可以缓存所有的HTTP请求,然后按照一定的算法并发地发出这些请求。RequestQueue内部的设计就是非常合适高并发的,因此我们不必为每一次HTTP请求都创建一个RequestQueue对象,这是非常浪费资源的,基本上在每一个需要和网络交互的Activity中创建一个RequestQueue对象就足够了。

  1. RequestQueue mQueue = Volley.newRequestQueue(context);  

 1、StringRequest的用法(get请求)
/**     * 用StringRequest去请求     * 第一步创建request对象,     * cnew listener成功时返回,     * new Errolistener失败是返回。     * 把创建好的放进 实例化好的RequestQueue mQueue;     */    public void init() {//        可以看到,这里new出了一个StringRequest对象,//        StringRequest的构造函数需要传入三个参数,//        第一个参数就是目标服务器的URL地址,第二个参数是服务器响应成功的回调,//        第三个参数是服务器响应失败的回调. 然后在响应成功的回调里打印出服务器返回的内容,在响应失败的回调里打印出失败的详细信息。        StringRequest stringRequest = new StringRequest(URL,                new Response.Listener<String>() {                    @Override                    public void onResponse(String response) {
//这里是我自己封装的一个log方法。                        Tool.show(Volley1.this, response.toString());                    }                }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                Tool.show(Volley1.this, error.toString() + "=====" + error);            }        });//        把StringRequet放到已经创建好的mQUeue        mQueue.add(stringRequest);    }

2、StringRequest的用法(post请求)

/**     * 用StringRequest带参请求     * 第一步创建request对象,     * cnew listener成功时返回,     * new Errolistener失败是返回。     * {这里面写一个请求参数}     * 把创建好的放进 实例化好的RequestQueue mQueue;     */    public void init1() {        StringRequest stringRequest = new StringRequest(Request.Method.POST, URL, new Response.Listener<String>() {            @Override            public void onResponse(String s) {                Tool.show(Volley1.this, s.toString());            }        }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {                Tool.show(Volley1.this, volleyError.toString() + "=====" + volleyError);            }        }) {            @Override            protected Map<String, String> getParams() throws AuthFailureError {                Map<String, String> map = new HashMap<String, String>();                map.put("pno", "2");                return map;            }        };        mQueue.add(stringRequest);    }

3、JsonRequest的用法

 /**     * JsonRequest请求方式     * 第一步创建request对象,     * cnew listener成功时返回,     * new Errolistener失败是返回。     * 把创建好的放进 实例化好的RequestQueue mQueue;     */    public void init2() {        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(URL, null,                new Response.Listener<JSONObject>() {                    @Override                    public void onResponse(JSONObject response) {                        Tool.show(Volley1.this, response.toString());                    }                }, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                Tool.show(Volley1.this, error.toString() + "========" + error);            }        });        mQueue.add(jsonObjectRequest);    }

4、 ImageRequest的用法

 /**     * ImageRequest请求网络图片     * 第一个参数图片网址     * 第二个参数请求成功的回调     * 第三第四个参数分别用于指定允许图片最大的宽度和高度,     * 如果指定的网络图片的宽度或高度大于这里的最大值,则会对图片进行压缩,     * 指定成0的话就表示不管图片有多大,都不会进行压缩     * 第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用     * 其中ARGB_8888可以展示最好的颜色属性,     * 每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。     * 第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。     */    public void init3() {        ImageRequest imageRequest = new ImageRequest(                IMG, new Response.Listener<Bitmap>() {            @Override            public void onResponse(Bitmap response) {                img.setImageBitmap(response);            }        }, 0, 0, Bitmap.Config.RGB_565, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError error) {                img.setImageResource(R.mipmap.img1);            }        });        mQueue.add(imageRequest);    }

5、 ImageLoader的用法

 /**     * ImageLoader请求网络     * ImageLoader的构造函数接收两个参数,第一个参数就是RequestQueue对象,     * 第二个参数是一个ImageCache对象,这里我们先new出一个空的ImageCache的实现即可。     * 我们通过调用ImageLoader的getImageListener()     * 方法能够获取到一个ImageListener对象,getImageListener()方法接收三个参数,     * 第一个参数指定用于显示图片的ImageView控件,     * 第二个参数指定加载图片的过程中显示的图片,     * 第三个参数指定加载图片失败的情况下显示的图片。     * 调用ImageLoader的get()方法来加载图片     */    public void init4() {
//这里是自己写好了一个缓存的接口,所以注释掉了        ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());//        ImageLoader imageLoader1 = new ImageLoader(mQueue, new ImageLoader.ImageCache() {//            @Override//            public Bitmap getBitmap(String s) {//                return null;//            }////            @Override//            public void putBitmap(String s, Bitmap bitmap) {////            }//        });        ImageLoader.ImageListener listener = ImageLoader.getImageListener(img, R.mipmap.img2, R.mipmap.img2);        imageLoader.get(IMG, listener);    }
缓存的接口
public class BitmapCache implements ImageLoader.ImageCache {    private LruCache<String, Bitmap> mCache;    public BitmapCache() {        int maxSize = 10 * 1024 * 1024;        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);    }}

NetworkImageView的用法

1、先写一个它自带的xml控件。
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"      android:layout_width="fill_parent"      android:layout_height="fill_parent"      android:orientation="vertical" >        <Button          android:id="@+id/button"          android:layout_width="wrap_content"          android:layout_height="wrap_content"          android:text="Send Request" />            <com.android.volley.toolbox.NetworkImageView           android:id="@+id/network_image_view"          android:layout_width="200dp"          android:layout_height="200dp"          android:layout_gravity="center_horizontal"          />    </LinearLayout>  

2在布局中反射这个控件
这是NetworkImageView这个类型的,千万不要写错

 network_img = (NetworkImageView) findViewById(R.id.network_img);
3代码实现
/**     * Volley还提供了第三种方式来加载网络图片,即使用NetworkImageView     * NetworkImageView是一个自定义控制,它是继承自ImageView的,具备ImageView控件的所有功能,并且在原生的基础之上加入了加载网络图片的功能。     * NetworkImageView控件的用法要比前两种方式更加简单     * 1. 创建一个RequestQueue对象。     * 2. 创建一个ImageLoader对象。     * 3. 在布局文件中添加一个NetworkImageView控件。     * 4. 在代码中获取该控件的实例。     * 5. 设置要加载的图片地址。     * <p>     * setDefaultImageResId()方法、setErrorImageResId()方法和setImageUrl()     * 方法来分别设置加载中显示的图片,加载失败时显示的图片,以及目标图片的URL地址     * 其中,setImageUrl()方法接收两个参数,第一个参数用于指定图片的URL地址,第二个参数则是前面创建好的ImageLoader对象。     * 压缩过程是在内部完全自动化的,并不需要我们关心,     */    public void init5() {        ImageLoader imageLoader = new ImageLoader(mQueue, new BitmapCache());        network_img.setDefaultImageResId(R.mipmap.img1);        network_img.setErrorImageResId(R.mipmap.img2);        network_img.setImageUrl(IMG,                imageLoader);    }
通过测试看出来Imageloder虽然好用但是点击一次就会加载一遍,而networkImageView则加载一次后,不会在加载。






1 0
原创粉丝点击