浅谈android volley

Volley概述

  • Volley的简介
    Volley是Android平台上的网络通信库,适用于属于数据量不大,但网络通信频繁的应用。但不适合数据的上传和下载。

  • Volley的特点
    通信更快,更简单
    Get、Post网络请求及网络图像的高效率异步处理请求
    对网络请求进行排序
    网络请求的缓存
    多级别取消请求
    和Activity生命周期的联动

  • 为什么使用Volley
    高效的Get\Post方式的数据请求交互
    网络图片加载和缓存(不使用Volley的情况下,进行网络图片的处理会非常麻烦,非常容易内存溢出。)
    谷歌官方推出
    性能上很稳定

在Android Studio中进行配置

1.在gradle中添加依赖,如下

compile 'com.mcxiaoke.volley:library:1.0.19'

然后Build->Make Project,Android Studio就会自动下载有关volley的类库。

2.因为得进行联网的操作,所以还得添加联网的权限
在AndroidManifest.xml中加上如下权限

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

使用StringRequest

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //1.创建一个RequestQueue对象
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        //2. 创建一个StringRequest对象
        StringRequest stringRequest = new StringRequest("http://www.baidu.com",
                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("ERROR",error.getMessage(),error);
            }
        });
        //3. 将StringRequest对象添加到RequestQueue里面。
        queue.add(stringRequest);
    }
}
HTTP的请求类型通常有两种,GET和POST,上述代码使用的是一个GET请求。

使用JsonRequest

JsonRequest是一个抽象类,它有两个直接的子类,JsonObjectRequest和JsonArrayRequest,前者一段JSON数据,后者用于请求一段JSON数组。
下面的代码是关于JsonObjectRequest的使用。

public class MainActivity extends AppCompatActivity {
    private ImageView iv_picture;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_picture = (ImageView) findViewById(R.id.iv_picture);

        //1. 创建一个RequestQueue对象
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        //2. 创建一个JsonObjectRequest对象

        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest("http://www.weather.com.cn/data/cityinfo/101010100.html", null,
                new Response.Listener<JSONObject>() {
                    @Override
                    public void onResponse(JSONObject response) {
                        //此处可以进行json解析
                        Log.d("TAG",response.toString());
                    }
                }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("ERROR",error.getMessage(),error);
            }
        });
        //3. 将jsonObjectRequest对象添加到RequestQueue里面。
        queue.add(jsonObjectRequest);
}

由上述代码可知,JsonObjectRequest和StringRequest的用法基本上是完全一样的,JsonArrayRequest亦然。

使用ImageRequest

ImageRequest则是用于请求网络上的一张图片

public class MainActivity extends AppCompatActivity {
    private ImageView iv_picture;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_picture = (ImageView) findViewById(R.id.iv_picture);

        //1. 创建一个RequestQueue对象
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());
        //2. 创建一个ImageRequest对象

        //第一个参数就是图片的URL地址
        //第三第四个参数分别用于指定允许图片最大的宽度和高度,
        // 如果指定的网络图片的宽度或高度大于这里的最大值,
        // 则会对图片进行压缩,指定成0的话就表示不管图片有多大,
        // 都不会进行压缩。第五个参数用于指定图片的颜色属性,
        // Bitmap.Config下的几个常量都可以在这里使用,其中ARGB_8888可以展示最好的颜色属性,
        // 每个图片像素占据4个字节的大小,而RGB_565则表示每个图片像素占据2个字节大小。
        //第六个参数是图片请求失败的回调
        ImageRequest imageRequest = new ImageRequest("http://pic8.nipic.com/20100725/2928847_183140012198_2.jpg",
                new Response.Listener<Bitmap>() {
                    @Override
                    public void onResponse(Bitmap response) {
                        iv_picture.setImageBitmap(response);
                    }
                }, 1024, 570, Bitmap.Config.ARGB_8888, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                iv_picture.setImageResource(R.mipmap.ic_launcher);

            }
        });
        //3. 将ImageRequest对象添加到RequestQueue里面
        queue.add(imageRequest);
}

运行结果如下:

这里写图片描述

使用ImageLoader

ImageLoader也可以用于加载网络上的图片,它的内部是使用ImageRequest来实现的,而且ImageLoader要比ImageRequest更加高效,它不仅可以对图片进行缓存,还可以过滤掉重复的链接,避免重复发送请求。

ImageLoader已经不是继承自Request的了,所以它的用法也和上述的例子有些不同。

public class MainActivity extends AppCompatActivity {
    private ImageView iv_picture;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        iv_picture = (ImageView) findViewById(R.id.iv_picture);

    }

    public void getImageView(View view){
        //1. 创建一个RequestQueue对象
        RequestQueue queue = Volley.newRequestQueue(getApplicationContext());

        //2. 创建一个ImageLoader对象
        ImageLoader imageLoader = new ImageLoader(queue, new ImageLoader.ImageCache() {
            @Override
            public Bitmap getBitmap(String url) {
                return null;
            }

            @Override
            public void putBitmap(String url, Bitmap bitmap) {

            }
        });

        // 3. 获取一个ImageListener对象
        //getImageListener()的第一个参数指定用于显示图片的ImageView控件,
        // 第二个参数指定加载图片的过程中显示的图片,
        // 第三个参数指定加载图片失败的情况下显示的图片

        ImageLoader.ImageListener listener = imageLoader.getImageListener(iv_picture,R.mipmap.ic_launcher,R.mipmap.ic_launcher);

        //4. 调用ImageLoader的get()方法加载网络上的图片
        imageLoader.get("http://img3.redocn.com/tupian/20151023/huaduotexie_5165818.jpg",listener,1000,593);



    }
}

运行结果如下:
这里写图片描述
(未完待续)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值