Android学习笔记:Volley

本文深入讲解了Volley网络通信框架的基本概念、用法及其在Android平台上的应用。涵盖请求队列、请求类型、图片加载、执行流程等内容,适用于数据量小、频率高的网络操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、Volley基本概念

Volley的Github地址:https://github.com/google/volley

Volley的基本用法:下载Volley库且放在libs目录下并add到工程中。(官网使用说明<需科学上网>

在2013年Google I/O大会上推出了一个新的网络通信框架Volley。Volley既可以访问网络取得数据,也可以加载图片,并且在性能方面也进行了大幅度的调整,它的设计目标就是非常适合去进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如说下载文件等,Volley的表现就会非常糟糕,因为Volley处理http返回的默认实现是BasicNetwork,它会把返回的流全部导入内存中,下载大文件会发生内存溢出。(与之相对,OkHttp则更适合数据量大的重量级网络请求

Volley框架默认在Android2.3及以上版本使用HttpURLConnection来完成网络操作,在Android2.3以下版本使用HttpClient来完成网络操作。

Volley请求网络都是基于请求队列的,只需要把请求放在请求队列(RequestQueue)里,请求队列就会依次进行请求。


二、Volley进行HTTP通信的步骤

  • 1、创建RequestQueue队列
  • 2、创建Request对象,并加入队列中
  • 3、处理回调事件

三、Volley框架中的请求类型

请求类型说明
StringRequest返回字符串数据
JsonObjectRequest返回JSONObject数据
JsonArrayRequest返回JSONArray数据
ImageRequest返回Bitmap类型数据

四、Volley请求流程图

Volley请求流程图


五、如何使用Volley进行异步加载图片?

1、使用Volley框架的ImageLoader类来异步加载图片

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

使用ImageLoader类加载网络图片的具体步骤如下:

  • 1、分别创建一个RequestQueue、ImageCache、ImageLoader对象。
  • 2、通过ImageLoader类获取一个ImageListener的对象。
  • 3、调用ImageLoader类的get()方法加载网络上的图片。
2、使用Volley框架的NetworkImageView来异步加载图片

NetworkImageView继承自InageView,是Volley框架中提供的一个全新且简单加载图片的控件,该控件可直接用于显示网络上的图片。


六、Volley的执行过程

默认情况下,Volley中开启四个网络调度线程和一个缓存调度线程,首先请求会加入缓存队列,缓存调度线程从缓存队列中取出线程,如果找到该请求的缓存就直接读取该缓存并解析,然后回调给主线程,如果没有找到缓存的响应,则将这个请求加入网络队列,然后网络调度线程会轮询取出网络队列中的请求,发起HTTP请求,解析响应并将响应存入缓存,回调给主线程。


七、为什么Volley不适合下载上传大文件?为什么适合数据量小的频率高的请求?

1、volley基于请求队列,Volley的网络请求线程池默认大小为4。意味着可以并发进行4个请求,大于4个,会排在队列中。并发量小所以适合数据量小频率高的请求。
2、因为Volley下载文件会将流存入内存中(是一个小于4k的缓存池),大文件会导致内存溢出,所以不能下载大文件,不能上传大文件的原因和1中差不多,设想你上传了四个大文件,同时占用了volley的四个线程,导致其他网络请求都阻塞在队列中,造成反应慢的现象。


八、StringRequest方式的GET用法

//建立一个请求队列
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest mStringRequest = new StringRequest(Request.Method.GET, "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(TAG, error.getMessage(), error);
		}
	});
//将请求添加到请求队列中
mQueue.add(mStringRequest);

九、StringRequest方式的POST用法

//建立一个请求队列
RequestQueue mQueue = Volley.newRequestQueue(getApplicationContext());
StringRequest mStringRequest = new StringRequest(Request.Method.POST, "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(TAG, error.getMessage(), error);
  }
 }{
 @Override
 protected Map<String, String> getParams() throws AuthFailureError{
	Map<String, String> params = new HashMap<>();
	params.put("key1", "value1");
	params.put("key2", "value2");
	return params;
 }
});
//将请求添加到请求队列中
mQueue.add(mStringRequest);

十、VolleyDemo

项目简介:采用Volley框架,通过访问聚合API查询手机归属地。
项目地址:https://github.com/ambition-hb/VolleyDemo

部分代码如下:

/**
 * 1、Volley的Get和Post请求方式的使用
 * 2、volley的网络请求队列建立(全局的请求队列)和取消队列请求及Activity周期关联
 */
public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
//        volley_Get();
        volley_Post();
    }

    @Override
    protected void onStop() {
        super.onStop();
        //保证Activity在销毁或关闭的时候,请求可以同时进行销毁。防止后台运行请求,影响用户体验。
        MyApplication.getHttpQueue().cancelAll("abcPost");
        MyApplication.getHttpQueue().cancelAll("abcGet");
    }

    private void volley_Post() {
        String url = "http://apis.juhe.cn/mobile/get?";
        StringRequest request = new StringRequest(Request.Method.POST, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_LONG).show();
            }
        }){
            @Override
            protected Map<String, String> getParams() throws AuthFailureError {
                HashMap<String, String> map = new HashMap<String, String>();
                map.put("phone", "18829354567");
                map.put("key", "fef8795fcfa0a1977582d8c31b529112");
                return map;
            }
        };
        request.setTag("abcPost");
        MyApplication.getHttpQueue().add(request);
    }

    private void volley_Get() {
        String url = "http://apis.juhe.cn/mobile/get?phone=18829354567&key=fef8795fcfa0a1977582d8c31b529112";
        StringRequest request = new StringRequest(Request.Method.GET, url, new Response.Listener<String>() {
            @Override
            public void onResponse(String s) {
                Toast.makeText(MainActivity.this, s, Toast.LENGTH_LONG).show();
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError volleyError) {
                Toast.makeText(MainActivity.this, "网络请求失败", Toast.LENGTH_LONG).show();
            }
        });
        //设置Tag标签,当想取消请求的时候,可通过该标签对请求进行取消
        request.setTag("abcGet");
        //将请求添加到队列里面
        MyApplication.getHttpQueue().add(request);
    }
}

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值