自从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. [YII2] COOKIE的操作使用

    PHPcookie的设置 setcookie('username',$data['username'],time()+3600*24*7); YII2cookie的设置 $cookies = Yii: ...

  2. wordpress 常用操作

    删除主题 在主题目录 wp-content/themes 中直接删除即可. 首页和文章页使用不同主题 首页使用sidebar,文章页不使用sidebar,这样文章的内容可以占更宽的页面 安装插件 Mu ...

  3. tp5.1 依赖注入的使用

    参考:概念:https://blog.csdn.net/qq_36172443/article/details/82667427应用: http://www.cnblogs.com/finalandd ...

  4. php中switch与ifelse的效率分析

    1.当被判断的值是常量(固定不变的值)时,switch的运行效率比ifelse的运行效率高: $jiejie=3;   // 变判断的值为常量 switch($jiejie){   case 1:   ...

  5. docker企业级镜像仓库Harbor管理

    Harbor概述 Harbor是由VMWare公司开源的容器镜像仓库.事实上,Harbor是在Docker Registry上进行了相应的企业级扩展,从而获得了更加广泛的应用,这些新的企业级特性包括: ...

  6. HTML中使用CSS样式(下)

    上节内容回顾加补充: 补充:默认img标签,有一个1px的边框 如果点击图片跳转到连接,a标签下套img标签,在IE有的版本中,会有蓝色边框. <a href="http://blog ...

  7. JAVA学习之路 (五) 类

    java类的学习 先上一个代码 package bankCard; import java.util.Scanner; // 银行卡类 public class bankCard { // 静态变量 ...

  8. iOS开发·runtime原理与实践: 消息转发篇(Message Forwarding) (消息机制,方法未实现+API不兼容奔溃,模拟多继承)...

    本文Demo传送门: MessageForwardingDemo 摘要:编程,只了解原理不行,必须实战才能知道应用场景.本系列尝试阐述runtime相关理论的同时介绍一些实战场景,而本文则是本系列的消 ...

  9. HTML5学习笔记之表格标签

    HTML5学习笔记之表格标签 其他HTML5相关文章 HTML5学习笔记之HTML5基本介绍 HTML5学习笔记之基础标签 HTML5学习笔记之表格标签 HTML5学习笔记之表单标签 HTML5学习笔 ...

  10. 从零搭建Prometheus监控报警系统

    什么是Prometheus? Prometheus是由SoundCloud开发的开源监控报警系统和时序列数据库(TSDB).Prometheus使用Go语言开发,是Google BorgMon监控系统 ...