XVolley-基于Volley的封装的工具类

volley框架封装(实现的非常好) 实现的volley 框架的各种功能,包括 异步图片 各种request请求,很有参考价值 立即下载

1.Volley源码分析(一)
2.Volley源码分析(二)
3.Volley源码分析(三)
4.XVolley-基于Volley的封装的工具类

前面几篇博客分析了Volley的源码,加上最近在看《Head First设计模式》这本书(不得不说老外的书是真的不错,推荐),于是基于鸿洋大神的OkhttpUtil的源码和OkHttp的源码,加上自己的理解,封装了这么一个工具类。

一、功能

1.GET
2.POST
3.post传json
4.post传文件(不支持大文件类型)
5.自定义拦截器
6.gson
7.配置URL
8.全局URL,HEADER,拦截器

二、优化

1.单例模式保证全局请求队列
2.weakreference持有Activity,支持onFinish()回调,防止内存泄漏
3.支持全局配置URL,HEADER
4.链式调用
5.增加过滤器

三、未来构思

1.支持cookie
2.支持大文件
3.支持上传文件进度回调
4.支持https
5.构思ing…

How to:

Step 1. Add the JitPack repository to your build file
Add it in your root build.gradle at the end of repositories:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }

Step 2. Add the dependency

dependencies {
            compile 'com.github.sdfdzx:XVolley:v1.0.0'
    }

Usage

1.在Application中初始化请求队列。
 XVolley.create(getApplicationContext());
2.在Application中全局配置Header,URL,Intercepter.(可选)

通过调用init(Config config)方法,Config通过BaseConfigBuilder构建。

Map<String, String> header = new HashMap<>();
header.put("user-token", "AEUHY98QIASUDH");
BaseConfigBuilder config = new BaseConfigBuilder();
config.baseUrl("http://127.0.0.1/get.php")
      .addParam("client", "Android")
      .addParam("position", "北京")
      .addHeaders(header)
      .addIntercept(new Interceptor() {
          @Override
          public Request intercept(Chain chain) {
              Request request = chain.request();        LogUtil.log("intercept","baseIntercept:"+request.getUrl());
                        return request;
          }
       });
XVolley.create(getApplicationContext())
       .init(config.build());
3.GET请求
XVolley.getInstance()
       .doGet()
       .url("http://127.0.0.1/get.php")
       .addParam("name", "xuan")
       .build()
       .execute(this, new CallBack<String>() {
           @Override
           public void onSuccess(Context context, String response) {
           }
       });

这里的.url()方法会覆盖掉全局配置的URL,如果使用全局的URL,直接调用addParam方法即可,根据自己需求使用。

4.POST请求
        XVolley.getInstance()
                .doPost()
                .url("http://127.0.0.1/post.php")
                .addParam("user", "xuan")
                .build()
                .execute(this, new CallBack<String>() {
                    @Override
                    public void onSuccess(Context context, String response) {
                        Log.e("Success", response);
                    }
                });
5.POST请求传String字符串
        weather weather = new weather();
        weather.setCity("北京");
        weather.setMessage("这是一条带json的post请求");

        //post请求带json
        XVolley.getInstance()
                .doPostString()
                .url("http://127.0.0.1/stringpost.php")
                .content(new Gson().toJson(weather))
                .build()
                .execute(this,new CallBack<String>(){
                    @Override
                    public void onSuccess(Context context, String response) {
                        Log.e("Success", response);
                    }
                });
6.上传文件(小文件,字节流实现方式)

支持多文件,多参数。

XVolley.getInstance()
       .doPostFile()
       .url("http://127.0.0.1/filex.php")
       .addParam("name","xuan")
       .addFile("txt", "bb.txt", Environment.getExternalStorageDirectory() + "/bb" +
                                ".txt")
       .addFile("png", "aa.txt", Environment.getExternalStorageDirectory() + "/aa" +
                                ".png")
       .build()
       .execute(MainActivity.this, new CallBack<String>() {
           @Override
           public void onSuccess(Context context, String response) {
                LogUtil.log("success",response);
           }
        });
7.Gson解析

只需要在链式调用中加上goGson(Class c)方法,传入Gson对应的class类型。所有类型请求都可以。

XVolley.getInstance()       
        .doGet()
        .url(       "http://www.sojson.com/open/api/weather/json.shtml")
       .addParam("city", "北京")
       .addHeaders(header)
       .goGson(weather.class)
       .build()
    .execute(MainActivity.this, new CallBack<weather>() {
        @Override
        public void onSuccess(Context context, weather response) {
        Log.e("Success", response.getCity());
            }
        });
8.过滤器。

实现Interceptor接口的intercept方法。

public interface Interceptor {
    Request intercept(Chain chain);

    interface Chain {
        Request request();
    }
    }

(1)支持全局过滤器

Map<String, String> header = new HashMap<>();
header.put("user-token", "AEUHY98QIASUDH");
BaseConfigBuilder config = new BaseConfigBuilder();
        config.baseUrl("http://127.0.0.1/get.php")
      .addParam("client", "Android")
      .addParam("position", "北京")
      .addHeaders(header)
      .addIntercept(new Interceptor() {
          @Override
          public Request intercept(Chain chain) {
               Request request = chain.request();         LogUtil.log("intercept","baseIntercept:"+request.getUrl());
                        return request;
               }
       });
XVolley.create(getApplicationContext())
       .init(config.build());

(2)支持单独过滤器

Map<String, String> header = new HashMap<>();
header.put("APP-Secret", "ad12msa234das232in");
XVolley.getInstance()
       .doGet()
       .url(
"http://www.sojson.com/open/api/weather/json.shtml")
       .addParam("city", "北京")
       .addHeaders(header)
       .goGson(weather.class)
       .build()
       .addInterceptor(new Interceptor() {
           @Override
           public Request intercept(Chain chain) {                      LogUtil.log("intercept","custom");
               Request request = chain.request();
               String url = request.getUrl();
               if (url.contains("sojson")) {
                   request.cancel();
                   return request;
                }
                return request;
            }
        })
        .execute(MainActivity.this, new CallBack<weather>() {
             @Override
             public void onSuccess(Context context, weather response) {
                  Log.e("Success", response.getCity());
             }
        });

(3)支持全局+单独
递归调用,先调用单独的过滤器再调用全局过滤器

9.CallBack

可以实现ICallBack接口实现所有方法

public interface ICallBack<T> {
    void onBefore();
    void onSuccess(Context context, T response);
    void onError(VolleyError error);
    void onAfter();
    void onFinish();
    }

或者实现CallBack类,实现对应需要的方法。

public abstract class CallBack<T> implements ICallBack<T> {
    @Override
    public void onBefore() {
    }
    @Override
    public void onSuccess(Context context, T response) {
    }
    @Override
    public void onError(VolleyError error) {
    }
    @Override
    public void onAfter() {
    }
    @Override
    public void onFinish() {
    }
    }

onFinish方法对应请求过程中Activity销毁的回调,可用于回收资源,防止内存泄漏。

10.Listener

内部Listener使用WeakReference持有Activity对象,防止内存泄漏。

public abstract class WeakListener{
    final WeakReference<Activity> activityWeakReference;
    final ICallBack callBack;
    public WeakListener(Context activity, ICallBack callBack) {
        activityWeakReference = new WeakReference<Activity>((Activity) activity);
        this.callBack = callBack;
    }
    }

最后给上Github地址:https://github.com/sdfdzx/XVolley

安卓开发框架工具类相关-Volley框架自定义请求.rar Volley框架自定义请求.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。 立即下载

相关推荐

医疗领域BGE-M3模型微调全流程:从数据准备到效果评估

本文详细介绍了医疗领域BGE-M3模型的微调全流程,从数据准备到效果评估。通过医疗数据微调,BGE-M3模型在临床问答、病历检索等场景中表现显著提升,能够准确理解医学术语之间的细微差别。文章还提供了实战练习代码和效果评估指标,帮助开发者快速掌握医疗文本嵌入模型的应用技巧。

weixin_29098367的博客 282

Volley 实现原理解析(转)

转自:https://github.com/android-cn/android-open-project-analysis/tree/master/volley Volley 实现原理解析 本文为 Android 开源项目实现原理解析 中 Volley 部分 项目地址:Volley,分析的版本:35ce778,Demo 地址:Volley Demo 分析者:grumoon,校

JasonZhang 2万+

cvtColor +内存泄漏

题目不知道怎么取,因为cvtColor并没有产生内存泄漏,但是我由于没有正确使用cvtColor而出现了内存泄漏的问题,所以暂且以cvtColor+内存泄漏为题 1.应用背景 项目中用到cvtColor的地方是需要将灰度图转为3通道的彩色图(实际上转换后仍然为灰色的,但是电脑认为的是3通道的彩色图了) 因此需要用到以下语句 cvtColor(src_img, cvMtxRGB, C

smilebluesky的专栏 6058

Volley配置OkHttp的那些事儿

volley配置okhttp,以及引发的超时问题

Goach的专栏 1737

手把手教你学PCIE(1.38)--基本概念:ATU(地址转换单元)

ATU(Address Translation Unit)是一种硬件单元,用于在PCIe系统中进行地址转换。它将设备的本地地址(外部地址)转换为系统内存或配置空间中的全局地址(内部地址),反之亦然。ATU的工作原理:通过地址匹配和转换,确保事务能够在不同的地址空间之间正确路由。配置寄存器:通过配置寄存器来设置地址转换规则。应用场景:地址空间隔离、访问控制、动态地址管理、虚拟化和多租户。

MHD0815的博客 2057

【软考高级架构】案例题考前突击6——大数据架构

前一类的数据主要由流量方以接口的方式提供(比如对接的腾讯广点通平台),后一类则是某网特有的数据,通过买家的浏览、下单、付款日志算出来。1. 在数据层面只维护一张包含所有指标的MySQL表,表中的stday字段作为索引,stday=当天的保存实时数据,stday<当天的保存离线数据。典型的大数据架构,除了Lambda架构之外,还有kappa架构,这两个架构的区别如下标所示,请补充表中空(1)-(4)第二,实时数据只对接了内部的kafka消息,没有实时的获取第三方的曝光、点击、浏览数据。

qq837993702的博客 67

Volley

转载请注明出处:http://blog.youkuaiyun.com/guolin_blog/article/details/17482095 1. Volley简介 我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClie

先疯盗骨 995

(代码可运行)半导体器件和工艺模拟 使用Silvaco设计构建NMOS并提取各项工艺及器件参数

win10。

qq_20388971的博客 110

Android开源项目推荐之「网络请求哪家强」

不少人老催这个系列,好吧,今天就更新一篇干货给你们。网络请求这个话题基本是所有 App 开发都会遇到的,这也难怪之前很多人留言让我写写网络请求到底该怎么选择,今天就来说说网络请求到底哪家强! 1. 原则本篇说的网络请求专指 http 请求,在选择一个框架之前,我个人有个习惯,就是我喜欢选择专注的库,其实在软件设计领域有一个原则叫做 「单一职责原则」,跟我所说的「专注」不谋而合,一个库能把一件事

stormzhang的专栏 5341

基于FPGA的数字图像处理-直方图操作【3.3】

对于固定的位宽和图像分辨率来说,这个计算过程是 可定量的,也就是这个归一化系数是已知的。1.直方图累计和 根据数学定义,直方图累加和的定义是小于指定像素的所有像素 的统计值之和。在实际应用中,处理帧缓存是费时费力费资源的一件事情,在许 多情况下,图像的变换比较慢,在这种情况下的一个近似是当建立当 前帧的直方图统计结果时使用从前一帧得到的映射。由测试结果可见,这两幅过曝光和曝光不足的图像,经过均衡化 之后的效果图差别不大,对比度都非常高,设计代码达到了预期的均 衡目的。累加和的计算情况如图6-28所示。

qq_43416206的博客 1127

C++笔记之emplace_back(),push_back()性能比较i++ 、 ++i

操作是否需要临时对象/拷贝性能需要(构造临时对象)较慢不需要(直接构造)较快i++需要(保存旧值)对于内置类型无影响,但对于自定义类型(如迭代器、大对象)会有拷贝开销++i不需要相对更快(尤其是自定义类型)都存在"是否需要额外的临时对象/拷贝"这一性能差异点和++i都是更高效的版本(避免临时对象/拷贝)和i++都可能产生额外的临时对象(前者构造临时对象,后者保存旧值)对于内置类型(如int),i++和++i性能几乎没有差异(编译器会优化);但对于自定义类型(尤其是迭代器等重量级对象),

小勇博客 98

Volley原理和Okhttp原理

Volley原理和Okhttp原理

TianciZhu的博客 1345

嵌入式工程师成长之路(2)——电路设计

为什么你的电源模块总是发热炸机?DC/DC和LDO选型的“潜规则”你踩坑了吗? LM2596降压芯片用错电容导致输出振荡?LED恒流驱动设计让灯珠寿命缩水50%?24V转12V方案成本超预算被老板狂喷?——这些血泪教训,谁能懂得!

云轩阁 13万+

网络请求框架之拦截器

package zhanghegang.com.bawei.onetime.utils; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; import android.util.Log; impo

anshuangxin6666的博客 690

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

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

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

Volley,Okhttp,Retrofit源码研究心得大总结

Volley源码解析系列 Okhttp源码解析系列 Retrofit源码解析系列 注:阅读本篇博文之前建议阅读上面几个系列的博文,算是本篇文章的理论储备。 以前在业余的时候阅读过Volley,Okhttp,Retrofit的源码,本篇就对他们做一个大总结和巩固。 1、框架涉及到的设计模式 工厂模式:这个模式很简单,与其说是一个模式,不如说它是一个变成习惯。该模式的直观作用之一就是减少重复代码,方便...

菜鸟博客 1635

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

myHttpRequestVolley

package com.skyfront.utils; import java.io.UnsupportedEncodingException; import java.util.Map;import org.json.JSONException; import org.json.JSONObject;import android.util.Log;import com.android.volley

张小丫的程序员的修行之路 571

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

Android http连接方式选择,从Volley窥探Google处理方式

Android APP在处理网络连接这块,使用Http请求时,一直一来主要使用这两种方式:一种是HttpClient,另一种是HttpUrlConnection。 关于两者的区别可以参考该文档-http://blog.youkuaiyun.com/huzgd/article/details/8712187,对两者做了比较详细的介绍及说明。 而在Android 6.0版本开始,Google正式

tangxl2008008的专栏 759

Android Volley详细解析(一):Volley基本用法

一、什么是Volley?  Volley,是谷歌官方于2013年发布的用于Android平台的网络通信库,也即是说它内部封装了HttpURLConnection等常用于网络通信的类。平时我们写网络通信的业务逻辑的时候,通常是一大段一大段的HttpURLConnection的逻辑,这给我们造成了很多麻烦,如可能存在很多重复的代码或者效率过低又或者存在并发问题。而Volley的出现,极大简化了网络通信的

蓝天白云梦的csdn博客 6471

android网络开源框架volley(五)——volley的一些细节

最近又把volley拿出来整理了下。之前没有遇到过的一些小问题又来了,在此记录下: 1、HttpUrlConnection DELETE 方式无法添加body的问题:java.net.ProtocolException: DELETE does not support writing 2、关于(修改)volley的缓存

ttdevs 5331

修改volley默认超时时间以及重连次数

See com.android.volley.Request.setRetryPolicy() and the constructor for DefaultRetryPolicy, e.g. 代码如下:myRequest.setRetryPolicy(new DefaultRetryPolicy( MY_SOCKET_TIMEOUT_MS,

沐怡旸的专栏 3万+

Volley网络通信框架、XUtils

VolleyVolley是在Google I/O 2013上发布的网络通信框架,是Android平台上的网络通信库,能使网络通信更快,更简单,更健壮。特别适用于数据量不大但是通信频繁的场景。架构设计使用方法我们使用Volley发送一个GET请求或者POST请求,来连接网络。也可以来加载一个网络图片等。 首先我们在布局中加入两个按钮,一个用来点击请求网络连接,一个用来点击加载网络图片,这里加载的图片

苦逼的程序猿☺ 1441

volley二次封装

volley二次封装

smile的专栏 1224

Volley自动获取以及存储Cookie

Volley是Google开发的一款android网络框架,非常适合小数据大并发的访问服务器,但Volley中没有提供Cookie方面的管理,幸好它是开源框架,下面就跟大家分享一下具体的修改流程: 提示:Http请求分为request和response,两者都有头信息,而Cookie的信息就是在头信息中进行传递,所以可以锁定,需要修改的地方在头信息相关的地方。第一步:通过查看源码发现,com.an

Hunter ——Android交流专栏 3927

网络请求框架-Volley

    Volley框架特点:   适用于频繁请求而每次请求数据量不会很大; 在请求的基础上做了磁盘缓存; 防止多次相同请求浪费资源; 提供String、Json、图片异步下载; 网络请求的优先级处理; 图片请求无需担心生命周期问题。       创建Android项目配置volley部件,通过网络访问获取数据,对网络访问的数据(JSON)进行解析。 1、新建一个pro...

dream_miracle的博客 751
上一篇: Volley源码分析(三)
下一篇: okhttp源码分析(一)——基本流程(超详细)
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值