android网络开源框架volley(二)——自定义你的请求对象

使用Volley发起网络请求 前言 本文是对Google官方文档中关于Volley部分的学习和总结,原文地址详情参考,通过对文档的翻译和学习,总结出自己的理解,通过一个Demo来展现 Volley概述 Volley是一个Google推出的一个HTTP网络请求开源库,它可以简化Android应用程序的联网操作,以更快的速度进行网络请求,很多大公司的App都集成了Volley库。 Volley开源库具有的优点包括: 自动进行网络... 阅读详情

上篇文章简单的介绍了volley的使用,这篇偶将继续和大家一起分享volley的使用。

其实忘记一件很重要的事情,我相信也是很多初识volley的人困惑的地方,就是从哪里开始学习,认识volley,使用volley,可能你谷歌或者百度到的最多的就是一个简单demo或者对volley介绍的翻译,如果你很牛可能理解起来很容易,但是对于我等菜鸟还是有点难度的。虽然偶的水平有限,但是我会尽量遵照自己这段时间对volley的认识过程来总结。


1、volley的部署

上篇提到我们不会直接在Activiy中创建volley的请求队列对象,因为这个对象我们只要一个就够了。既然不这样那我们该怎么做呢,这里给一个建议。先上一张项目结构图:


思路是这样的:我们在application中对volley进行初始化。然后通过静态方法拿到这个对象,即可在所有地方使用,关键代码如下(来自:https://github.com/ogrebgr):

/**
 * 这段代码来自这里:https://github.com/ogrebgr
 * 
 * @author ttdevs
 */
public class VolleyQueue {
	private static RequestQueue mRequestQueue;
	private static ImageLoader mImageLoader;

	private VolleyQueue() {

	}

	/**
	 * 初始化我们的请求队列。这个地方有一个BitmapLruCache,这个是在后面做图片加载的时候会提到的图片缓存策略
	 * 
	 * @param context
	 */
	static void init(Context context) {
		mRequestQueue = Volley.newRequestQueue(context);

		int memClass = ((ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE)).getMemoryClass();
		// Use 1/8th of the available memory for this memory cache.
		int cacheSize = 1024 * 1024 * memClass / 8;
		mImageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(cacheSize));
	}

	public static RequestQueue getRequestQueue() {
		if (mRequestQueue != null) {
			return mRequestQueue;
		} else {
			throw new IllegalStateException("RequestQueue not initialized");
		}
	}

	public static ImageLoader getImageLoader() {
		if (mImageLoader != null) {
			return mImageLoader;
		} else {
			throw new IllegalStateException("ImageLoader not initialized");
		}
	}
}
这样我们就可以在想要的地方随意使用了。


2、自定义请求

通过第一步拿到请求队列对象之后我们就可肆意的发请求了~~简单的GET请求我们之前已经展示过,下面要说的就是POST方式的请求和自定义自己的请求对象。在此之前,我们先来看一下volley源码的结构,这里也直接上两张图:

红线标注的部分我们看到了熟悉的StringRequest,这个就是我们之前使用的那个请求类。具体源码大家可以去先看一下,这样对下面的代码理解会有很大帮助。
当你简单查看上图的几个*****Request类之后你会发现他们有一个共同的特点:都是继承了Request类。这里先告诉大家,自定义请求类也是继承这个Request类的。我们照着StringRequest类可以得到一个下面的自定义请求类:
public class CustomReqeust extends Request<String> {

	private final Listener<String> mListener;

	public CustomReqeust(int method, String url, Listener<String> listener, ErrorListener errorListener) {
		super(method, url, errorListener);
		mListener = listener;
	}

	@Override
	protected Response<String> parseNetworkResponse(NetworkResponse response) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	protected void deliverResponse(String response) {
		// TODO Auto-generated method stub

	}
}
我们简单的分析下这几行代码。首先是构造函数,通过super我们发现,构造函数中我们需要提供三个参数,分别是:method、url、errorListener,它们的意思分别是:请求方式,即POST/GET;请求的URL;出错时的回调监听器。而StringRequest的构造函数中多了一个Listener<String> listener,这个通过前面的demo大家应该知道它是用来处理请求结果的,当然大部分情况我们是需要这个东西的,因此我们把它加上。这样就完整了。下面还有两个必须实现的方法,这个是干什么的呢?我们先来看看StringRequest中这两个方法的实现:
    @Override
    protected void deliverResponse(String response) {
        mListener.onResponse(response);
    }

    @Override
    protected Response<String> parseNetworkResponse(NetworkResponse response) {
        String parsed;
        try {
            parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
        } catch (UnsupportedEncodingException e) {
            parsed = new String(response.data);
        }
        return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
    }

protected void deliverResponse(String response) {}
传递响应,通过我们初始化时候设置的成功监听器来传递HTTP响应结果。
protected Response<String> parseNetworkResponse(NetworkResponse response){}
通过名称我们猜测是解析网络响应,对StringRequest类源码分析我们大致得出结论它应该是根据HTTP头的编码解析HTTP包体。当我们处理特殊的或者自定义的HTTP请求时就可以在此处实现对HTTP包体进行解析。

说了这么多我们还是没有说到如何进行HTTP的POST请求,因为我们还没讲到如何设置POST方式的请求参数。

自习翻阅volley源码中的几个request类的子类,我们可以在JsonRequest类中发现如下代码:
   /**
     * Returns the raw POST or PUT body to be sent.
     *
     * @throws AuthFailureError in the event of auth failure
     */
    @Override
    public byte[] getBody() {
        try {
            return mRequestBody == null ? null : mRequestBody.getBytes(PROTOCOL_CHARSET);
        } catch (UnsupportedEncodingException uee) {
            VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s",
                    mRequestBody, PROTOCOL_CHARSET);
            return null;
        }
    }
对,你猜的没错,他就是处理我们请求参数的方法,在这里我们组织好要传的参数,然后转换成byte数组即可。这样我们就可以开始实现自己自定义的请求了。下面贴一个简单的完整例子供参考:
public class CustomReqeust extends Request<String> {
	/** http请求编码方式 */
	private static final String PROTOCOL_CHARSET = "utf-8";

	private Listener<String> mListener;
	private String mUserName;

	public CustomReqeust(String url, String userName, Listener<String> listener, ErrorListener errorListener) {
		super(Method.POST, url, errorListener);
		mUserName = userName;
		mListener = listener;
	}

	@Override
	protected Response<String> parseNetworkResponse(NetworkResponse response) {
		String parsed;
		try {
			parsed = new String(response.data, HttpHeaderParser.parseCharset(response.headers));
		} catch (UnsupportedEncodingException e) {
			parsed = new String(response.data);
		}
		return Response.success(parsed, HttpHeaderParser.parseCacheHeaders(response));
	}

	@Override
	protected void deliverResponse(String response) {
		mListener.onResponse(response);
	}

	@Override
	public byte[] getBody() {
		try {
			return mUserName == null ? null : mUserName.getBytes(PROTOCOL_CHARSET);
		} catch (UnsupportedEncodingException uee) {
			VolleyLog.wtf("Unsupported Encoding while trying to get the bytes of %s using %s", mUserName, PROTOCOL_CHARSET);
			return null;
		}
	}
}
调用代码不想不贴,但是要用到,还是贴一下(这里的URL还是www.baidu.com):
	private void customRequest() {
		CustomReqeust request = new CustomReqeust(URL, "CustomVolley", new Listener<String>() {

			@Override
			public void onResponse(String arg0) {
				Toast.makeText(getApplicationContext(), arg0, Toast.LENGTH_LONG).show();
				Log.d("onResponse", arg0);
			}
		}, new ErrorListener() {

			@Override
			public void onErrorResponse(VolleyError arg0) {
				Toast.makeText(getApplicationContext(), arg0.toString(), Toast.LENGTH_LONG).show();
				Log.d("onErrorResponse", arg0.toString());
			}
		});
		mQueue.add(request);
	}
由于没有测试服务器,因此就简单的抓包看一下,结果如下:

从图中可以看到,我们的请求时正确的。至此我们就完成了自定义请求的实现。

3、总结

可以自定义的地方远远不止这些,更多的HTTP请求参数大家可以从几个Request子类入手,如JsonRequest类中用到的设置ContentType类型,getRetryPolicy()等。当你了解了这些东西之后你会发现volley真的是高端大气上档次。当然还有很多细节没有讲到,比如取消一个请求,设置请求超时等等,这些细节如果在分析源码的时候遇到会和大家分享。有时间会接着和大家分享volley对图片的加载。从下一篇开始,和大家分享volley的整个架构。最后,有不当之处欢迎吐槽。 
request.setRetryPolicy(new DefaultRetryPolicy(20 * 1000, 1, 1.0f));

后记:

现在时间是1:01分,吐槽两句:代码不是一切,这么晚了还在敲代码还是越少越好,还有更重要的事情等着你。谨此Mark下可能将要失去的坚持了五年的恋爱。最后祝所有的单身程序猿都能找到自己的她……






深入解析开源项目之Volley框架 Volley是google在2013年io大会上推荐的网络通信框架,它封装了android中的网络请求模块,使开发者处理网络请求更加简单,适合数据量不大但是通信频繁的场景。 阅读详情

相关推荐

LoRA学习: SX1276/SX1277/SX1278对比

Lora芯片 SX1276/SX1277/SX1278的比较SX1276/7/8是一种半双工传输的低中频收发器,配备标了标准FSK和远距离扩频Lora调制解调器。该芯片可以用于超长距离的Lora扩频通信,并且抗干扰性强,同时达到低功耗要求。1、芯片关键参数对比: 可以看出SX1276的带宽范围为 7.8~500kHz ,扩频 因子6~12,并覆盖所有可用频段。 SX1277的带宽和频段方位与 S

HowieXue 薛永浩的博客 1万+

android网络开源框架volley之二

上篇文章简单的介绍了volley的使用,这篇偶将继续和大家一起分享volley的使用。 其实忘记一件很重要的事情,我相信也是很多初识volley的人困惑的地方,就是从哪里开始学习,认识volley,使用volley,可能你谷歌或者百度到的最多的就是一个简单demo或者对volley介绍的翻译,如果你很牛可能理解起来很容易,但是对于我等菜鸟还是有点难度的。虽然偶的水平有限,但是我会尽量遵照自己这段...

xidajiancun 260

gson,volley封装,实现网络返回json自动转对象

懂得能看懂,能用自己改改,gson和volley框架jar包自己下

android中Volley网络请求异常之VolleyError

Volley的异常列表: AuthFailureError:如果在做一个HTTP的身份验证,可能会发生这个错误。 NetworkError:Socket关闭,服务器宕机,DNS错误都会产生这个错误。 NoConnectionError:和NetworkError类似,这个是客户端没有网络连接。 ParseError:在使用JsonObjectRequest或JsonArrayRequest

yhy123456q的博客 8045

使用c语言写的卷积运算程序

标准C语言计算卷积的公式,在VC下编译通过

TSAdmin (统一应用管理系统)

零成本搭建企业私有云系统! 自动登录到网站和应用程序。 限制员工对关键信息的访问。 限制员工对内外网站的访问。 员工操作记录的记录和回放。 员工操作内容的搜索和统计。 工作忙闲时段和应用使用情况的统计报告。 统一应用管理系统 和 统一应用审计系统 是私有云解决方案中的两个部分, 共同构建一个安全的私有云系统。 统一应用管理系统 管理用户可以使用的应用程序和用户可以登录的内外网站, 基于不同的安全策略,限制用户对磁盘文件的访问。 统一应用审计系统 记录用户会话中的全部操作,可随时回放,可根据文件名、网址等内容搜索审计记录, 还可以统计和分析用户的忙闲时段、应用程序的使用频率等内容。

Volley框架的理解以及自定义各个对象

Volley框架的基本流程就是: 我们在代码中 RequestQueuequeue 是这样写的: StringRequestrequest = new StringRequest(URL, new Response.Listener() {         @Override       public void onResponse(String s) {

u012345683的博客 743

基于Verilog的数字钟设计

基于Altera公司的FPGA设计,时分秒可调的数字钟

Android网络框架-Volley(二) RequestQueue源码分析以及建立一个RequestQueue

从上一篇文章我们可以知道,Volley的整个工作都是建立在一个RequestQueue上的,所以理解RequestQueue对于我们使用Volley是很有必要的,上一篇文章的例子中,我们使用Volley.newRequestQueue()创建了一个RequestQueue实例,那么我们就先来看一看Volley是怎么把RequestQueue创建出来的吧。 public class Volley...

android开发笔记 348

PowerBuilder基础教程

PowerBuilder是美国Powersoft公司于90年代初推出的基于客户/服务器体系结构的面向对象的数据库开发工具。该产品一上市即深受广大应用开发人员的喜爱,因此迅速占领市场,目前几乎已发展成为前端工具的事实上的标准。著名数据库软件公司Sybase收购Powersoft公司以后,PowerBuilder通过Sybase较早地介绍给了中国用户。 1994年Powersoft公司又在北京建立办事处,PowerBuilder便广泛为中国的用户接受和使用。所开发的应用已广泛地应用于金融、证券、邮电、商业等各个部门和各个领域,并发挥着巨大的作用。据有关方面统计,PowerBuilder在中国的市场占有率目前已达40%左右。 Sybase公司及其代理商在从事PowerBuilder的销售、培训和技术支持等服务时,经常发现由于用户来自各个行业,专业背景不同,开发经验不同,再兼之国内的有关书籍和资料较少,因此造成用户对Power-Builder的很多特性不甚了解, 在进行深入开发时遇到了很多困难。鉴于此,开办PowerBuilder应用开发系列讲座,本讲座面向正在使用PowerBuilder进行开发的读者,主要讨论使用PowerBuilder进行数据库应用开发的经验和开发技巧

Mamba vs YOLO:目标检测选型指南(附实际项目对比)

本文深入对比了Mamba和YOLO在目标检测领域的性能差异与应用场景。通过实际项目数据,分析了两者在城市交通监控、工业质检等场景下的表现,提供了详细的选型指南和部署优化建议,帮助开发者根据实时性、精度等需求选择最适合的解决方案。

weixin_29062255的博客 369

JAVA网络请求和几种网络框架

第3个月:ACTION权限依赖1.原生网络请求 安卓中网络请求方式 一.HttpUrlConnection:最基础的,重点 (1)get请求 (2)post请求 (3)get请求数据下载到SD卡中:图片,视频,音频,带进度条的下载 二.HttpClient:已经过时的,安卓SDK26以后该类已经被谷歌删掉了 三.Xutils:第三方框架,功能比较全(数据库,图片,网络。。。。),发明这个东西的人...

yuhui77268769的博客 8138

若依前后端分离版实战:MQTT集成保姆级教程(含MQTTX测试工具使用)

本文详细介绍了在若依前后端分离架构中集成MQTT协议的完整流程,包括环境搭建、核心配置、安全实践及性能优化。通过MQTTX测试工具的使用和实战代码示例,帮助开发者快速实现物联网场景下的实时通信功能,提升系统稳定性和效率。

weixin_30664051的博客 457

三种网络请求开源框架:Volley、Okhttp、Retrofit

网络请求框架千千万,我选择Retrofit

Alpinist Wang 1395

tmux + Claude Code 远程开发指南:从 WSL 配置到断线无忧

远程开发中,SSH 连接中断常导致后台任务丢失,这是困扰开发者的经典难题。tmux 作为终端复用器,通过将进程挂在常驻会话中,使其脱离 SSH 连接独立运行,从根本上解决了断线导致的任务终止问题。Claude Code 等 AI 编程代理需要长时间运行并保持交互上下文,恰好依赖这种会话持久化能力。结合 Windows Subsystem for Linux 提供类 Unix 环境,开发者可在 Windows 上实现稳定的远程开发工作流。本文将完整介绍从 WSL 环境配置、tmux 会话管理,到与 Claud

weixin_30423065的博客 348

STM32CubeIDE之SHT3X温湿度传感器移植HAL库

有了前面的OLED的学习,这个学习起来也很快。 分以下几步走 1.你要有个温度传感器,SHT3X这个型号的,因为我要讲这个 2.你要有个STM32开发板(我用的是STM32L431RCT) 3.顺便找台电脑下载一个STM32CubeIDE 4.简单的找一个SHT3X的驱动,我是去某宝嫖的,一般卖这个的都有,这个驱动分两个文件,是.c和.h的,我直接把这两个放在下边 读了我上一篇的人,看这个应该很熟悉吧,一样的套路,学习方法是一样的,你就照搬就行 下面是sht3x.c的原文档,里面有个CRC..

qq_47736089的博客 2316

android自定义网络请求框架,六款值得推荐的android(安卓)网络请求开源框架简介...

1、volley项目地址 https://github.com/smanikandan14/Volley-demo(1) JSON,图像等的异步下载;(2) 网络请求的排序(scheduling)(3) 网络请求的优先级处理(4) 缓存(5) 多级别取消请求(6) 和Activity和生命周期的联动(Activity结束时同时取消所有网络请求)2、android-async-http项...

weixin_36183464的博客 1343

基于yolov5的鸟类图像准确识别

本项目主要基于yolov5进行鸟类准确识别,主要识别白鹭家族,红脚鹬,反嘴鹬,环颈珩,小白鹭以及夜鹭六类鸟

weixin_46064184的博客 3823

Android常用开源网络框架(一)—— Volley篇

Android常用开源网络框架 在Android开发中,网络请求是最重要的模块之一,Android中大部分网络请求使用的是HTTP连接,包括原生的HttpClient和HttpUrlConnection两种访问网络方式。需要注意的是,HttpClient方式在Android6.0以后,很多类已经不支持了。 目前主流的开源网络框架,主要有OkHttp,Volley,Retrofit三种,我本人在短暂...

步步小猫的博客 738

【零基础入门unity游戏开发——unity通用篇30】Resources资源加载(基于unity6开发介绍)

Resources资源加载(基于unity6开发介绍)

向宇的博客,专注php/web全栈 unity游戏开发,欢迎大家评论纠错 4119

【YoloV8改进策略】上采样改进|EUCB,轻量高效的上采样模块|即插即用

YOLOv8作为当前最先进的实时目标检测与实例分割模型之一,其在速度与精度之间取得了出色的平衡。然而,在资源受限的边缘设备或对实时性要求极高的应用场景中,YOLOv8的计算开销,尤其是在特征金字塔网络(FPN)和路径聚合网络(PAN)中用于特征融合的上采样操作,仍然是一个瓶颈。YOLOv8的颈部(Neck)结构中广泛使用nn.Upsample进行上采样,该操作虽然简单,但缺乏对特征内容的感知能力,且后续通常需要标准卷积来修复因插值带来的伪影,这增加了不必要的计算负担。

m0_47867638的博客 757

Volley框架简介

一、引言 虽然网上已经有很多大神、高手都写过了类似的帖子,但作为新人,必须要走模仿的道路,再考虑超越,因此学习大神的笔记,记录自己的理解,是一个菜鸟走向成功的必经之路啊。如签名所言,记录自己摸爬滚打的经历,享受不悔的青春。废话不多说,言归正传。 二、Volley是什么? Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架。 三、Volley的主要特性 (

不悔的青春 4018

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

android volley框架详解,android通信框架volley详解(一)

什么是volley?volley是2014年google在I/O大会上推出的,解决android设备中频繁,但数据量不大的网络访问问题的一个开源框架。它的优势:1.自动调度网络请求,处理并发与缓存。2.支持取消已经发出的请求,但不适合大量数据请求。我们将在几篇文章中讨论如下问题:1.使用volley建立网络访问与请求数据。2.请求数据缓存与中断网络请求。3.建立请求队列与标准网络请求。4.改造vo...

weixin_29666489的博客 1559

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

【安卓网络请求开源框架Volley源码解析系列】初识Volley及其基本用法

在安卓中当涉及到网络请求时,我们通常使用的是HttpUrlConnection与HttpClient这两个类,网络请求一般是比较耗时,因此我们通常会在一个线程中来使用,但是在线程中使用这两个类时就要考虑到如何将处理结果传出去,通常的解决方法就是采用接口回调技术来解决,代码如下: publ...

chicaochan5767的博客 103
上一篇: android网络开源框架volley(一)——从一个demo开始
下一篇: android网络开源框架volley(三)——请求队列是主线
ttdevs
博客等级 码龄15年 388粉丝 91原创
评论 14
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值