Android学习笔记:Volley

Android语言基础教程(249)Android通过HTTP访问网络范例之从指定网站下载文件:神奇!Android一招搞定网络文件下载,程序员看完都笑了 本文深入讲解Android通过HTTP从网络下载文件的四种实战方法,涵盖Volley、DownloadManager、HttpURLConnection和多线程下载,附带完整代码示例和避坑指南,帮助开发者快速掌握文件下载技能。 阅读详情

一、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);
    }
}

安卓学习笔记43:初试开源框架Volley 文章目录零、学习目标一、Volley概述(一)安卓HTTP网络编程两种方式(二)简化HTTP通信,推出Volley框架二、案例演示 - 利用Volley下载网页(一)运行效果(二)涉及知识点(三)实现步骤1、创建安卓应用【DownloadWebPageByVolley】2、将背景图片拷贝到drawable目录3、主布局资源文件activity_main.xml4、字符串资源文件strings.xml5、在模块构建文件里添加对Volley的依赖6、在项目清单文件里授权访问因特网7、主界面类 - MainAct 阅读详情

相关推荐

Android在线边缓存边播放MP4视频开发实战

流媒体播放的核心流程包括以下几个关键步骤:用户发起播放请求:用户点击某个视频链接,应用开始准备播放。网络请求建立:客户端向服务器发起视频数据请求,通常使用HTTP协议。数据分段下载:服务器返回视频数据时,客户端按需分段下载视频内容。本地缓存写入:下载的视频数据被缓存到本地存储中,便于后续播放或离线使用。播放器加载数据:播放器从本地缓存或直接从网络流中读取数据并解码播放。缓存与播放同步:后台持续下载后续视频内容,确保播放流畅不卡顿。

weixin_33419305的博客 1091

Volley.jar程序文件

Android Volley的jar包,包中含有源码。

volley集成文件上传和下载带进度条

volley源码修改集成文件上传和断点下载支持进度条,2015年9月写的代码,很久不用了,供大家参考。

Volley扩展——文件断点下载(支持下载进度)

volley同样不适合大文件下载,只能自己扩展了,我这里参考了Netroid,有兴趣的可以去分析下,文件下载模仿了图片的加载方式,添加了两个类分别是FileDownloadRequest和FileDownloader。

s569646547的博客 9310

android 使用volley下载文件和加载gif图片

这个是我写的比较满意的,禁止一切转载,需要请联系博主。 大家都知道Volley是谷歌官方推出来的网络库,使用他进行数据交互,图片加载都非常方便,但是他不支持下载文件,网上很多人都说,他下载文件的性能非常不好,所以就没有提供下载的功能,这个是前提。在安卓上面,默认是不支持显示GIF图片的,如果你用ImageView,也只会显示GIF图的第一帧,这个我们可以用的开源的GifImageView 控件,gi

星雨晴空 6719

Androidvolley网络框架的文件下载

volley框架的文件下载真的是很少见的了,自己做一下记录 import android.os.Environment; import android.support.annotation.NonNull; import android.util.Log; import com.android.volley.NetworkResponse; import com.android.volley...

CQ173的博客 2165

为什么volley只适合数据量小,并发高的请求

作者:梦想家 链接:https://www.zhihu.com/question/51021564/answer/123888450 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 Volley的网络请求线程池默认大小为4。意味着可以并发进行4个请求,大于4个,会排在队列中。 Request#getBody() 方法返回byte[]类型,作为 Http.POS

static_void_james的博客 1466

Android —— 网络请求框架 Volley

前言: Volley 是 Google 推出的 Android 异步网络请求框架和图片加载框架。在 Google I/O 2013 大会上发布。谷歌官方网址Github上面已经有大神做了镜像,使用Gradle更方便。Volley On GithubVolley的总体设计图如下所示:Volley使用(1)首先就是构造一个RequestQueue 的请求队列, 它可以缓存所有的Http请求, 内部处理

七号座先生的博客 1161

安卓开发学习笔记(3):网络请求之Volley

Volley是Google开发的一个网络库: Volley 里面也封装了 ImageLoader ,所以如果你愿意你甚至不需要使用图片加载框架,不过这块功能没有 一些专门的图片加载框架强大,对于简单的需求可以使用,对于稍复杂点的需求还是需要用到专门的图片加载框架。 Volley 也有缺陷,比如不支持 post 大数据,所以不适合上传文件。不过 Volley 设计的初衷本身也就是为频繁的、数据量小的网络请求而生

Frank_Yaozz的博客 443

Android学习笔记(四):Volley的使用

转自:http://my.oschina.net/summerpxy/blog/213207使用Volley以Http get的方式请求JSONObject对象,我们需要使用JsonObjectRequest类的构造方法。new JsonObjectRequest(url,jsonObject,listener)去构造一个请求request。url:请求的地址。jsonObject:需要传递的数据,

汤圆学Java 746

volley学习笔记(五):Android Volley框架的几种post提交请求方式

首先简单描述一下Google的Android开发团队在2013年推出的一个网络通信框架Volley.它的设计目标是进行数据量不大,但通信频繁的网络操作,而对于大数据量的网络操作,比如下载文件等,Volley的表现就不尽如人意。在app开发中,我们最常见的就是从app客户端向服务端发一个http请求.对于两种基本的web请求方式get和post来说,get请求方式相对比较简单,在此略过不表.本文重点描

滴水穿石,磨杵成针,厚积薄发;明天你好 490

volley学习笔记(四):Android利用Volley异步加载数据(JSON和图片)完整示例

MainActivity如下:package cc.testvolley; import org.json.JSONObject; import android.app.Activity; import android.app.ProgressDialog; import android.graphics.Bitmap; import android.os.Bundle; import a

滴水穿石,磨杵成针,厚积薄发;明天你好 423

Android学习笔记:Andorid网络请求框架Volley的使用(上)

Volley框架是Google I/O 2013大会上发布的。Volley是Google针对Android平台上的网络通信库而诞生,该框架能使网络通信更快,更简单,更健壮。Volley的特点有: Ⅰ:通信更简单更快捷 ll:Get,Post网络请求及网络图像进行高效异步处理 III:可以对多个网络请求进行优先级排序以级多级别取消操作 IV:网络请求缓存及与Activity生命周期进行联动,

true100的专栏 1539

Android学习笔记:Andorid网络请求框架Volley的使用(中)--网络图片加载

对上一篇笔记《Android学习笔记:Andorid网络请求框架Volley的使用(上)》一个小补充:我们用Volley请求数据,不要忘记在AndroidManifest.xml中添加网络访问权限。今天学习的目标是实现网络图片的加载,Vollery中实现图片的加载有三种方式,我们可以根据实际情况来选择加载方式,加载方式直接上代码: public class MyApplication exten

true100的专栏 1203

安卓框架Volley介绍及简单使用,2024年最新android插件化和组件化

题外话,我在一线互联网企业工作十余年里,指导过不少同行后辈。帮助很多人得到了学习和成长。我意识到有很多经验和知识值得分享给大家,也可以通过我们的能力和经验解答大家在IT学习中的很多困惑,所以在工作繁忙的情况下还是坚持各种整理和分享。但苦于知识传播途径有限,很多程序员朋友无法获得正确的资料得到学习提升,故此将并将重要的Android进阶资料包括自定义view、性能优化、MVC与MVP与MVVM三大框架的区别、NDK技术、阿里面试题精编汇总、常见源码分析等学习资料。【Android思维脑图(技能树)】

pCITv1C的博客 3027

安卓框架Volley介绍及简单使用

安卓最热门框架Volley介绍及简单使用Volley简介使用方式导入使用字符数据的处理StringRequest 网络请求返回字符串JsonObjectRequest json格式的数据通信图片数据的处理ImageRequest 图片请求ImageLoader 更加强大的网络图片请求 Volley简介 所谓Volley,它是2013年Google I/O上发布的一款网络框架,基于Android平台...

fjnu_se的博客 4637

Code For Better 谷歌开发者之声——Android 中的 Volley

尽管 VolleyAndroid 开源项目 (AOSP) 的一部分,但 Google 在 2017 年 1 月宣布 Volley 将迁移到一个独立的库。它管理网络请求的处理和缓存,并节省开发人员一次又一次编写相同的网络调用/缓存代码的宝贵时间。:将请求分发到网络时使用的兴趣。如果需要,可以根据需要创建一个请求队列,但通常它是在启动时的早期创建的,并保留它并将其用作 Singleton。1.所有需要在 Android 中使用 Networking 完成的任务,都可以在 Volley 的帮助下完成。

前端好玩的小案例、游戏、工具 9691

优雅设计封装基于Okhttp3的网络框架(一):Http网络协议与Okhttp3解析

如今Android开发中Okhttp已成为主流网络框架,内置丰富、全面、强大的网络请求功能,也为开发者提供了api,但是在项目开发中的大量使用,会出现api的重复调用、代码冗杂等现象。应当封装一个适用于项目的网络框架,便于使用。此系列文章旨于:基于okhttp3原始框架来设计封装一个满足业务需求、扩展性强、耦合度低的网络框架。具体框架功能为: 扩展其对数据库的支持 对多文件上传、多线程文件下载的支持 数据解析

lemonGuo的大脑皮层、小脑、海马体、杏仁核..... 4866
上一篇: Android学习笔记:更新UI的方法(UI线程和非UI线程)
下一篇: Android学习笔记:Handler
浩比浩比
博客等级 码龄12年 395粉丝 202原创
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值