本篇文章已授权微信公众号 dasu_Android(大苏)独家发布

前面已经封装了很多常用、基础的组件了:base-module, 包括了:

  • crash 处理
  • 常用工具类
  • apk 升级处理
  • log 组件
  • logcat 采集
  • ftp 文件上传
  • blur 高斯模糊
  • fresco 图片处理
  • 等等

那么,今天继续再来封装一个网络组件,基于 volley 的二次封装,目的也是为了简化外部使用,以及新项目可快速接入使用。

这样一来,开发一个简单的 app 所需要的公共基础组件基本都已经封装好了,在这些组件基础上,应该可以快速完成第一版迭代,快速出包。

下一次的计划,也许是封装 OkHttp 的组件,也许是封装个播放器的组件,也可能是封装常用的自定义 View,视情况而定吧。

前言

封装了这么多组件,一步步走过来,我已经有了自己一定习惯下的封装思路了,可能代码写得并不是很好,设计得不是很合理,内部职责划分不是很明确。

但,我热衷的封装思想是:一条调用链使用

我喜欢借助 AndroidStudio 的代码提示功能,结合调用链的使用方式,将组件的使用划分成多个步骤,控制每个步骤的 api,让其他人使用的时候,最好可以达到不看文档,不看源码,只需要了解入口,之后都可以通过 AndroidStudio 的代码提示来一步步引导使用的目的。

至于为什么需要二次封装 Volley,这篇就不扯了,反正每个组件的封装肯定是来源于有这方面的需求。

二次封装

同样,DVolley 组件你需要了解的入口也就是:DVolley

第一个步骤我开放了三个 api,其实也就是 DVolley 大概支持的功能:

  • url()

用于访问服务端的接口

  • enterGlobalConfig()

用于配置一些公共的请求参数或请求头信息,比如 mac,t 这类通常都是公共的请求参数,不必每次都手动去设置。

  • cancelRequests()

内部支持一次性同时发起六条请求,网络问题等等总会导致某些请求在队列中等待,但如果这时页面退出了,那么这些请求应该就要取消掉,甚至已经发出的请求这时候才回来,那也应该不要通知上层 ui。所以,支持对每条请求设置 tag,然后根据 tag 来取消这些请求。

目前组件只支持三个功能:

  • post()

post 方式访问网络接口

  • get()

get 方式访问网络接口

  • asImageFile()

下载网络中的图片文件到本地指定目录,因为 volley 的设计并不能够很好的支持大文件的下载,所以就不提供这个了,刚好有下载图片文件的需求,所以就封装上了。

虽然 volley 也支持类似 fresco 这种框架对图片的缓存,加载处理,但这些工作一般项目里都选择 fresco 或 glide 来处理了,所以组件也就不提供 volley 的这些功能了。

下面看看下载图片文件的用法:

下载图片文件示例

DVolley.url("https://upload-images.jianshu.io/upload_images/1924341-d7190704b160d280.png")
.asImageFile()
.downloadTo(new File("/mnt/sdcard/my.png"), new VolleyListener<String>() {
@Override
public void onSuccess(String data) {
//data 是图片文件保存的目录地址
} @Override
public void onError(int code, String description) { }});

通常图片框架都默认处理图片下载后的缓存目录、保存格式、文件名等等。这就导致有时如果需要明确指定下载网络上某张图片到指定的本地目录中以指定的文件名存储,使用这些图片框架就有些麻烦了,所以就封装了这个功能。

继续回来看看正常的网络接口访问的使用:

post 方法支持的 api 跟 get 一样,也就是设置下 tag(用于取消该请求),设置下请求参数,请求头,然后调用 enqueue(),内部会根据队列情况自动发起请求,可设置回调,回调接收一个泛型参数,内部会自动根据泛型解析 json 数据后在回调方法中返回实体类数据。

所以,其实,封装的组件做的事并不多,就是将 Volley 的使用流程控制起来,提供调用链的使用方式。

使用示例

compile 'com.dasu.net:volley:0.0.1'
//get 方法获取 wanAndroid 网站的公众号列表,内部自动进行 json 解析
DVolley.url("http://wanandroid.com/wxarticle/chapters/json")
.get()
.enqueue(new VolleyListener<ArrayList<WanAndroid>>() {
@Override
public void onSuccess(ArrayList<WanAndroid> data) {
Log.w("!!!!!!!", "wan: " + data.size());
for (WanAndroid wan : data) {
Log.e("!!!!!!!!!!", wan.toString());
}
} @Override
public void onError(int code, String description) { }}); //post 方法请求,设置参数,请求头,tag(用于取消请求使用)
DVolley.url("https://easy-mock.com/mock/5b592c01e4e04f38c7a55958/ywb/is/version/checkVersion")
.post()
.tag("VolleyActivity")
.addParam("name", "dasu")
.addHeader("weixin", "dasuAndroidTv")
.enqueue(new VolleyListener<EasyMockReturn>() {
@Override
public void onSuccess(EasyMockReturn data) {
Log.e("!!!!!", "return: " + data);
} @Override
public void onError(int code, String description) { }
}); //取消tag为xxx的请求
DVolley.cancelRequests("VolleyActivity"); //下载图片文件到本地指定的目录
DVolley.url("https://upload-images.jianshu.io/upload_images/3537898-445477c7ce870988.png")
.asImageFile()
.downloadTo(new File("/mnt/sdcard/abcd.png"), new VolleyListener<String>() {
@Override
public void onSuccess(String data) {
Log.e("!!!!!", "asImageFile: " + data);
} @Override
public void onError(int code, String description) {
Log.e("!!!!!", "asImageFile: " + description);
}
}); //设置通用的请求参数或请求头
DVolley.enterGlobalConfig()
.globalParam("t", String.valueOf(System.currentTimeMillis()))
.globalHeader("os", "android");

Github地址

DVolley组件:https://github.com/woshidasusu/base-module/tree/master/volley

组件有如下两个依赖库:

compile 'com.android.volley:volley:1.1.1'
compile 'com.google.code.gson:gson:2.7'

支持以下功能:

  • get 请求
  • post 请求
  • 图片下载在本地指定目录
  • 自动根据泛型解析 json
  • 取消指定请求
  • 设置通用请求参数或请求头

大家好,我是 dasu,欢迎关注我的公众号(dasuAndroidTv),如果你觉得本篇内容有帮助到你,可以转载但记得要关注,要标明原文哦,谢谢支持~

继续封装个 Volley 组件的更多相关文章

  1. 基于jQuery封装的分页组件

    前言: 由于项目需要实现分页效果,上jQuery插件库找了下,但是木有找到自己想要的效果,于是自己封装了个分页组件. 思路: 主要是初始化时基于原型建立的分页模板然后绑定动态事件并实现刷新DOM的分页 ...

  2. 微信小程序封装年月日时分组件

    第一步,在page下新建component文件,放你封装的小组件,和vue里的component差不多 第二步,在需要使用的组件的.json文件中添加usingComponents 第三步,在页面中引 ...

  3. AngularJS指令封装高德地图组件

    1 概述 公司移动门户原来是基于AngularJS指令封装的百度地图组件,用于签到.签退.定位等功能,在使用过程中发现百度地图频繁的弹出广告,所以打算重新引用其它地图组件,最后决定基于AngularJ ...

  4. vue封装一些常用组件loading、switch、progress

    vue封装一些常用组件loading.switch.progress github文档https://github.com/zengjielin/vue-component-library loadi ...

  5. 基于jQuery封装的分页组件(可自定义设置)

    jQuery封装的分页组件 前几天做了一个vue的组件分页,而现在需求是jquery的分页,我就根据我自己的需求写了一个.在网上找了很久的基于jquery的分页封装,可是都不是我想要的结果,那么今天我 ...

  6. Vue + Element-ui实现后台管理系统(4)---封装一个ECharts组件的一点思路

    封装一个ECharts组件的一点思路 有关后台管理系统之前写过三遍博客,看这篇之前最好先看下这三篇博客.另外这里只展示关键部分代码,项目代码放在github上: mall-manage-system ...

  7. 【小程序】---- 封装Echarts公共组件,遍历图表实现多个饼图

    一.问题描述: 在小程序的项目中,封装公共的饼图组件,并在需要的页面引入使用.要求一个页面中有多个饼图,动态渲染不同的数据. 二.效果实现: 1. 查看——小程序使用Echarts的方式 2. 封装饼 ...

  8. Blazor组件自做四 : 使用JS隔离封装signature_pad签名组件

    运行截图 演示地址 响应式演示 感谢szimek写的棒棒的signature_pad.js项目, 来源: https://github.com/szimek/signature_pad 正式开始 1. ...

  9. vue3 vite2 封装 SVG 图标组件 - 基于 vite 创建 vue3 全家桶项目续篇

    在<基于 vite 创建 vue3 全家桶>一文整合了 Element Plus,并将 Element Plus 中提供的图标进行全局注册,这样可以很方便的延续 Element UI 的风 ...

随机推荐

  1. Javascript高级编程学习笔记(14)—— 引用类型(3)Date类型

    除了前两天介绍的Object.Array类型,Date应该就是JS中最常用的引用类型了 先介绍一下Date类型,该类型使用在Java的 java.until.Date 类的基础上构建的 使用UTC 1 ...

  2. 第一节:ASP.NET开发环境配置

    第一节:ASP.NET开发环境配置 什么是ASP.NET,学这个可以做什么,学习这些有什么内容? ASP.NET是微软公司推出的WEB开发技术. 2002年,推出第一个版本,先后推出ASP.NET2. ...

  3. Metasploit Framework(5)弱点扫描

    文章的格式也许不是很好看,也没有什么合理的顺序 完全是想到什么写一些什么,但各个方面都涵盖到了 能耐下心看的朋友欢迎一起学习,大牛和杠精们请绕道 当我们发现了目标机器开放的端口,开启的服务等等之后 就 ...

  4. 神经网络架构PYTORCH-宏观分析

    基本概念和功能: PyTorch是一个能够提供两种高级功能的python开发包,这两种高级功能分别是: 使用GPU做加速的矢量计算 具有自动重放功能的深度神经网络从细的粒度来分,PyTorch是一个包 ...

  5. Scala - 快速学习01 - Scala简介

    Scala简介 Scala(Scalable Language)是一门多范式(multi-paradigm)编程语言,Scala的设计吸收借鉴了许多种编程语言的思想,具备面向对象编程.函数式编程等特性 ...

  6. 【app】Appium日志文件分析

    Appium在和客户端及手机端进行通讯的时候会输出很多日志,可以通过点击主面板的Get Raw Logs得到其原始日志: 现在我们另存到其他路径,并且以notepad工具打开进行查看 Appium日志 ...

  7. 在 React、Vue项目中使用 SVG

    在一些现代的扁平化设计网站,特别是移动端网站,经常会包含许多简单而清晰的小图标,例如网站图标.用户的默认头像.移动端网页首页底部固定的切换栏等,这些小图标一般都是由美工做好,可能会放到精灵图上,前端再 ...

  8. Windows下安装及使用NVM

    Windows下安装及使用NVM 所谓nvm就是一个可以让你在同一台机器上安装和切换不同版本node的工具.这里是一篇安装及使用教程. 第一步:下载nvm 可以到github上下载最新版本https: ...

  9. mybatis框架(1)---mybatis入门

    mybatis入门   MyBatis是什么? MyBatis 本是apache的一个开源项目iBatis, 2010年这个项目由apache software foundation 迁移到了goog ...

  10. Python爬虫、自动化常用库&帮助文档URL

    一.Python下载地址 Windows终端Cmder.exe下载--->http://cmder.net/ Python下载(Windows)        ---> https://w ...