自从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. 解析一下阿里出品的泰山版 Java 开发手册

    说起华山,我就想起岳不群,不,令狐冲:说起泰山,我就想起司马迁,他的那句名言"人总有一死,或重于泰山,或轻于鸿毛",真的发人深省啊.这就意味着,阿里出品的泰山版 Java 开发手册 ...

  2. Manjaro Linux 入门使用教程

    Manjaro 初体验 Manjaro 是一款基于 Arch LInux 的自由开源发行版,它吸收了 Arch Linux 优秀丰富的软件管理,同时提供了稳定流畅的操作体验.优雅简单是它的追求,稳定实 ...

  3. JAVA 之 EL表达式

    一.什么是EL表达式 1.Expression Language表达式语言 2.是一种在JSP页面获取数据的简单方式(只能获取数据,不能设置数据) 语法格式:${expression } 二.EL中的 ...

  4. flex学习

            今天看视频学习的时候,发现css有一个 flex 的属性,非常的好用,为了让自己能够熟记,特意来分享一下flex的用法. 首先,采用Flex布局的元素,称为Flex容器(flex co ...

  5. JavaScript面向对象那些东西-继承

    继承 父类里有些属性方法 子类想把父类中的这些属性方法 继承过来给子类自己的实例也用用 ( ps: →_→ 能不能专业点 没文化真可怕 ) 一.原型链继承 // 原型链继承:把子类的原型作为父类的实例 ...

  6. spring security learning(spring in action)

    1.使用Spring Security配置命名空间 spring securtiy 提供了安全性相关的命名空间,我们可以将spring security的命名空间声明添加到spring公用的配置xml ...

  7. 嵌入式Linux学习笔记(三) 字符型设备驱动--LED的驱动开发

    在成功构建了一个能够运行在开发板平台的系统后,下一步就要正式开始应用的开发(这里前提是有一定的C语言基础,对ARM体系的软/硬件,这部分有疑问可能要参考其它教程),根据需求仔细分解任务,可以发现包含的 ...

  8. linux 进程管理和内存分配

    1.进程相关概念 进程:正在运行中的程序 内核功用:进程管理.文件系统.网络功能.内存管理.驱动程序.安全功能等 Process:运行中的程序的一个副本,是被载入内存的一个指令集合 进程 ID(Pro ...

  9. auto_ptr和shared_ptr

    <Effective C++>在资源管理一节提到了智能指针,智能指针中最著名的当属auto_ptr和shared_ptr.本文主要研究两者的实现. auto_ptr的实现: templat ...

  10. 2-MyBatisPlus教程(HelloWorld)

    1,准备数据 DROP TABLE IF EXISTS user; CREATE TABLE user ( id ) NOT NULL COMMENT '主键ID', name ) NULL DEFA ...