Android网络框架-Volley(一) 初步使用

来源:互联网 发布:开眼角疤痕知乎 编辑:程序博客网 时间:2024/06/02 02:37

先看看DEMO界面:

这里写图片描述

初步了解Volley:
一直有听Volley网络加载框架,但之前并未使用,想着看到很多大牛在项目中都运用Volley框架来与服务器进行网络通信,想着也得好好看看,不然就觉得自己太Low了。哈哈。关于Volley,封装有两个主要功能,一个是如AsyncHttpClient一样访问网络,只需要几行代码便可以访问网络;一个是能如Universal-Image-Loader一样加载图片。适合去进行数据量不大,但通信频繁的网络操作,而对于大数据网络操作,比如说下载文件等,Volley的表现就会非常糟糕。

项目Demo:
说明项目中用到的获取json字符串的链接来自聚合网数据(大家可以搜搜),但是这个使用次数到额,所以最后展示用的是本地的json文件的数据,其实和网络访问的是一样
的。json数据格式如下:

{    "error_code": 0,    "reason": "Success",    "result": {        "data": [            {                "id": 32650,                "valid": 0,                "body": "",                "title": "有一种安排叫做缘,冥冥之中,自有天意。有一张网叫做情,情网恢恢,疏而不漏。有一种爱叫思念,四处弥漫,牵牵绊绊。我在你眼内,你住我心间。"            },            {                "id": 32651,                "valid": 0,                "body": "",                "title": "人生中变化万千,但是总有一样没有变。那就是我爱你的誓言,一生中的每一天,全部都化成了思念。心中一直在祈愿,愿我们的爱情永远留在心间。"            },

1 StringRequest访问网络:
1.1 具体代码如下:

 private RequestQueue mQueue; private StringRequest stringRequest; private JsonObjectRequest jsonObjectRequest; private ImageRequest imageRequest; public String url="http://www.baidu.com"; mQueue= Volley.newRequestQueue(this); /*1 StringRequest请求网络*/stringRequest=new StringRequest(url, new Response.Listener<String>() {            @Override            public void onResponse(String response) {                Log.i("TAG",response);                tv.setText(response);            }        },new Response.ErrorListener(){            @Override            public void onErrorResponse(VolleyError volleyError) {                Log.i("TAG",volleyError.getMessage());            }        });

1.2 过程分析:
访问网络,发送HTTP请求之前需要先获取到一个ReqeustQueue对象,mQueue= Volley.newRequestQueue(this); 源码中是这样调用的,有这样三种构造方法:

public static RequestQueue newRequestQueue(Context context, int maxDiskCacheBytes) {        return newRequestQueue(context, (HttpStack)null, maxDiskCacheBytes);    }    public static RequestQueue newRequestQueue(Context context, HttpStack stack) {        return newRequestQueue(context, stack, -1);    }/*只传Context参数即可,在UI线程,可用this*/    public static RequestQueue newRequestQueue(Context context) {        return newRequestQueue(context, (HttpStack)null);    }

其中maxCacheSizeInBytes设置的是缓存的最大字节数,这个参数最终被传到DiskBasedCache方法中:

public DiskBasedCache(File rootDirectory, int maxCacheSizeInBytes) {        this.mEntries = new LinkedHashMap(16, 0.75F, true);//数据缓存的数据容器是LinkedHashMap,是一个双向链表        this.mTotalSize = 0L;        this.mRootDirectory = rootDirectory;//缓存文件名:File cacheDir = new File(context.getCacheDir(), "volley");        this.mMaxCacheSizeInBytes = maxCacheSizeInBytes;    }    //构造方法中还会传一个HttpStack接口对象,它封装是一个访问网络的方法,具体实现是它的子类HurlStack,HurlStack中封装了对HttpURLConnection的具体操作;    URL parsedUrl1 = new URL(url);    HttpURLConnection connection = this.openConnection(parsedUrl1, request);

1.3 最后将StringRequest对象添加到RequestQueue里面。

 mQueue.add(stringRequest);

2 使用JsonRequest
2.1 JsonRequest类似于StringRequest,JsonRequest也是继承自Request类的,不过由于JsonRequest是一个抽象类,因此我们无法直接创建它的实例,那么只能从它的子类入手了。JsonRequest有两个直接的子类,JsonObjectRequest和JsonArrayRequest,从名字上你应该能就看出它们的区别了吧?一个是用于请求一段JSON数据的,一个是用于请求一段JSON数组的。
使用代码:

/*2 JsonObjectRequest--Json数据*///传入四个参数,分别是jsonurl访问链接,jsonRequest,Response.Listener<JSONObject>返回监听对象,new Response.ErrorListener()请求失败监听。        jsonObjectRequest = new JsonObjectRequest(jsonUrl, null,                new Response.Listener<JSONObject>() {                    @Override                    public void onResponse(JSONObject response) {                        Log.d("TAG", response.toString());                        //    tv.setText(response.toString());                        JsonToBean(response);//将json字符串转java实体类;                    }                },                new Response.ErrorListener() {                    @Override                    public void onErrorResponse(VolleyError error) {                        Log.e("TAG", error.getMessage(), error);                    }                });

2.2 我们来瞧瞧JsonObjectRequest类
JsonObjectRequest继承自JsonRequest,JsonRequest是一个抽象类继承自Request类。Request类实现了Comparable接口,可用来对自定义的class比较大小。

public class JsonObjectRequest extends JsonRequest<JSONObject> {}public abstract class JsonRequest<T> extends Request<T> {}public abstract class Request<T> implements Comparable<Request<T>> {}

3 使用ImageRequest加载网络图片

 /*3 ImgaeRequest加载图片*/        imageRequest=new ImageRequest(imageUrl, new Response.Listener<Bitmap>() {            @Override            public void onResponse(Bitmap bitmap) {                image.setImageBitmap(bitmap);            }        }, 0, 0, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {            @Override            public void onErrorResponse(VolleyError volleyError) {                Log.i("TAG", volleyError.getMessage());            }        });     //ImageRequest的构造函数接收六个参数:     /** @deprecated */    @Deprecated    public ImageRequest(String url,         Listener<Bitmap> listener,        int maxWidth,         int maxHeight,         Config decodeConfig,         ErrorListener errorListener) {        this(url, listener, maxWidth, maxHeight, ScaleType.CENTER_INSIDE, decodeConfig, errorListener);    }        //第一个参数就是图片的URL地址。        //第二个参数是图片请求成功的回调,这里是UI线程,我们把返回的Bitmap参数设置到ImageView中。        //第三第四个参数分别用于指定允许图片最大的宽度和高度,如果指定的网络图片的宽度或高度大于此值,则会对图片进行压缩,指定成0的话表示不压缩。        //第五个参数用于指定图片的颜色属性,Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。        //第六个参数是图片请求失败的回调,这里我们当请求失败时在ImageView中显示一张默认图片。

以上,就是对Volley中的RequestQueue,StringRequest,JsonObjectRequest,ImageRequest类的基本了解和使用,最起码要晓得这几个类干嘛用,怎么用。Json的本地文件解析,代码中非常详细,就不介绍了。

Volley源码和jar包下载

项目DEMO代码下载

1 0
原创粉丝点击