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

先看看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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值