自从15年接触了RxJava,对函数式编程越发的喜爱。以前Android项目上网络层都是统一的使用Volley,已经对网络请求的回调,多个回调嵌入各种不爽了,趁着年前任务轻松,赶紧的将Volley封装一下,投向RxJava的怀抱!!

Volley除了提供异步处理回调接口外,还支持同步调用网络,主要是使用RequestFuture进行同步调用。所以Volley封装成Rx-Volley只需要以此为入口即可。

为了方便维护和升级,已将代码提交到git:https://github.com/cmlbeliever/RX-Volley

核心代码如下:

package com.cml.lib.rxvolley.rxvolley;

import com.android.volley.DefaultRetryPolicy;
import com.android.volley.Request;
import com.android.volley.RequestQueue;
import com.android.volley.RetryPolicy;
import com.android.volley.toolbox.RequestFuture;
import com.cml.lib.rxvolley.framework.RequestManager; import rx.Observable;
import rx.Subscriber;
import rx.schedulers.Schedulers; /**
* Created by cmlBeliever on 2016/2/1.
* <p>
* 将Volley请求封装成RxJava结构返回,注意:所有的请求都在IO线程中处理
*/
public class RxRequest { /**
* 发送post请求
*
* @param url
* @param target
* @param <T>
* @return
*/
public static <T> Observable<T> post(String url, Class<?> target) {
return request(url, target, Request.Method.POST, new DefaultRetryPolicy());
} /**
* 发送post请求
*
* @param url
* @param target
* @param <T>
* @return
*/
public static <T> Observable<T> post(String url, Class<?> target, RetryPolicy retryPolicy) {
return request(url, target, Request.Method.POST, retryPolicy);
} /**
* 发送Get请求
*
* @param url
* @param target
* @param <T>
* @return
*/
public static <T> Observable<T> get(String url, Class<?> target) {
return request(url, target, Request.Method.GET, new DefaultRetryPolicy());
} /**
* 发送Get请求
*
* @param url
* @param target
* @param <T>
* @return
*/
public static <T> Observable<T> get(String url, Class<?> target, RetryPolicy retryPolicy) {
return request(url, target, Request.Method.GET, retryPolicy);
} public static <T> Observable<T> request(String url, Class<?> target, int method, RetryPolicy retryPolicy) { final RequestFuture<T> requestFuture = RequestFuture.newFuture(); final GsonRequest<T> request = new GsonRequest<T>(target, method, url, null, requestFuture, requestFuture);
request.setRetryPolicy(retryPolicy);
request.setTag(url); requestFuture.setRequest(request); return Observable.create(new Observable.OnSubscribe<T>() { @Override
public void call(Subscriber<? super T> subscriber) {
try {
//只在被订阅后才进行网络请求处理
RequestManager.getRequestQueue().add(request);
if (!subscriber.isUnsubscribed() && !requestFuture.isCancelled()) {
subscriber.onNext(requestFuture.get());
subscriber.onCompleted();
}
} catch (Exception e) {
subscriber.onError(e);
}
} }).subscribeOn(Schedulers.io());
} /**
* 取消请求
*
* @param url
*/
public static void cancel(final String url) {
RequestManager.getRequestQueue().cancelAll(new RequestQueue.RequestFilter() {
@Override
public boolean apply(Request<?> request) {
return request.getTag().equals(url);
}
});
}
}

使用方式:

 String url = "https://raw.githubusercontent.com/cml8655/note/master/data/test.json";
RxRequest.<MyModel>post(url, MyModel.class).subscribe(new Subscriber<MyModel>() {
@Override
public void onCompleted() {
Log.i("RxRequest", "onCompleted");
} @Override
public void onError(Throwable e) {
Log.e("RxRequest", "onError", e);
} @Override
public void onNext(MyModel myModel) {
Log.i("RxRequest", "onNext==>" + myModel);
}
});

Rx-Volley 自己来封装的更多相关文章

  1. volley二次封装

    产品中使用Volley框架已有多时,本身已有良好封装的Volley确实给程序开发带来了很多便利与快捷.但随着产品功能的不断增加,服务器接口的不断复杂化,直接使用Volley原生的JSONObjectR ...

  2. Volley的简单封装

    算了一下,好像有很久没有写博客了.其实,关于写博客这件事,我从来没有把他当成我的一种任务,而是在学习过程中的一种总结和自我发现,同样也是为了练一练文笔,说不定有一天,我也能出一本书像<第一行代码 ...

  3. 基于Volley,Gson封装支持JWT无状态安全验证和数据防篡改的GsonRequest网络请求类

    这段时间做新的Android项目的client和和REST API通讯框架架构设计.使用了非常多新技术,终于的方案也相当简洁优雅.client仅仅须要传Java对象,server端返回json字符串, ...

  4. 转-封装网络请求库,统一处理通用异常 (基于volley网络请求库)

    http://blog.csdn.net/kroclin/article/details/40540761 一.前言 volley的发布让网络请求也变得十分便利,但是我们通常懒得很想用一两句代码实现一 ...

  5. Volley框架之网络请求和图片加载

    Volley是 Google 推出的 Android 异步网络请求框架和图片加载框架. Volley的特性 (1).封装了的异步的请求API.Volley 中大多是基于接口的设计,可配置性强.(2). ...

  6. Android常见工具类封装

    MD5加密 import android.annotation.SuppressLint; import java.security.MessageDigest; public class MD5 { ...

  7. Android框架之Volley与Glide

    PS:在看到这个题目的同时,你们估计会想,Volley与Glide怎么拿来一块说呢,他们虽然不是一个框架,但有着相同功能,那就是图片处理方面.首先我们先来看一下什么volley,又什么是glide. ...

  8. Xutils, OKhttp, Volley, Retrofit对比

    Xutils这个框架非常全面,可以进行网络请求,可以进行图片加载处理,可以数据储存,还可以对view进行注解,使用这个框架非常方便,但是缺点也是非常明显的,使用这个项目,会导致项目对这个框架依赖非常的 ...

  9. Android网络编程系列之Volley总结

    前言 Volley的中文翻译为“齐射.并发”,是在2013年的Google大会上发布的一款Android平台网络通信库,具有网络请求的处理.小图片的异步加载和缓存等功能,能够帮助 Android AP ...

  10. Android:Volley源代码解析

    简单实例 Volley是一个封装HttpUrlConnection和HttpClient的网络通信框架,集AsyncHttpClient和Universal-Image-Loader的长处于了一身.既 ...

随机推荐

  1. [linux] [nginx] 一键安装web环境全攻略phpstudy版,超详细!

    找到运行中的服务器(实例). 打开这个主要是看它的IP,是公网ip,公网ip,公网ip,重要的事情说三遍. 接下来我们可以不用在阿里云上操作了,直接用客户端操作,这两个客户端就是Xshell 5和Xf ...

  2. SpringCloud(四)学习笔记之Feign

    Feign是一个声明式的Web服务客户端,可帮助我们更加便捷.优雅地调用HTTP API Feign可以与Eureka和Ribbon组合使用以支持负载均衡 一.构建Eureka Server [基于第 ...

  3. leetcode-0543 二叉树的直径

    题目地址https://leetcode-cn.com/problems/diameter-of-binary-tree/ 递归+BFS(暴力解法) 我们可以考虑在每个节点时,都去计算该节点左子树和右 ...

  4. Java 多线程 -- 协作模型:生产消费者实现方式一:管程法

    多线程通过管程法实现生产消费者模式需要借助中间容器作为换从区,还包括生产者.消费者.下面以蒸馒头为列,写一个demo. 中间容器: 为了防止数据错乱,还需要给生产和消费方法加锁 并且生产者在容器写满的 ...

  5. linux--配置开发环境 --Nginx篇

    安装: 安装好了话,我们的nginx的目录在:  /etc/nginx 启动: sudo service nginx start 然后访问我们的页面就可以看到了我们的界面 然后我们配置我们的域名: 我 ...

  6. redis实现排行榜思路

    用redis的排序集合类型  sortset()实现排行榜 zadd();添加 ZREVRANGE();查看

  7. [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码生成 (修订版)

    [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码生成 (修订版) 目录 [源码分析]从"UDF不应有状态" 切入来剖析Flink SQL代码 ...

  8. 日志分析工具ELK(五)

    八.Kibana实践 选择绝对时间和相对时间 搜索 还可以添加相关信息 自动刷新页面时间,也可以关闭 创建图像,可视化 编辑Markdown,创建一个值班联系表 值班联系表 保存 再创建一个饼图;查看 ...

  9. Git初始化本地代码及提交到服务器

    2019独角兽企业重金招聘Python工程师标准>>> 1.先安装Git客户端 2.进入需要提交的文件夹目录 3.打开Git Bash,点击右键中的Git Bash 打开git命令窗 ...

  10. jQuery学习(二)

    操作DOM对象: 修改文本: jQuery对象的text()和html()方法可以用来获取节点的文本内容和HTML文本.而当你给方法传入参数时,这两个方法可以被用于设置jQuery的文本内容. 还是以 ...