自从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. jmeter json path espressions学习

    jsonpath表达式可以使用点或者括号来取值 管方详细介绍:https://goessner.net/articles/JsonPath/ $ :表示根对象 @:表示当前对象 . 或者[]:表示子运 ...

  2. 浅析Java7中的ConcurrentHashMap

    引入ConcurrentHashMap 模拟使用hashmap在多线程场景下发生线程不安全现象 import java.util.HashMap; import java.util.Map; impo ...

  3. 关于unix环境高级编程、Linux程序设计两部书浅谈

    unix环境高级编程的术语很多,概念内容,也很多,不过学习概念性质.标准规则类的东西,想必都是这样吧——需要进行拓展的内容很多. Linux程序设计,图文并茂,代码量够足,看起来,感觉难度还可以. l ...

  4. vscode--常用插件&同步

    1.setting.json文件 { "files.autoSave": "off", "extensions.ignoreRecommendatio ...

  5. Android | 教你如何快速集成机器学习能力

    背景   继上篇博文说了如何快速集成扫码以后 我又上官网去了解了一下其他的功能,其中机器学习服务是当下比较火的,而且还是免费的.就赶紧点进去学习一下.看看能够快速实现哪些功能. 链接在这里:https ...

  6. thinkphp5--关于多条件查询的分页处理问题

    首先,我们要想搞明白,我们的分页参数起作用的原理: 正在使用的时候的语法: if(!empty($seach)){ $where['user_name|mobile'] = ['like','%'.$ ...

  7. scrollview 和 listview滑动冲突解决

    http://blog.csdn.net/wanghao200906/article/details/51084975 http://www.cnblogs.com/shitianzeng/artic ...

  8. 递归复制&查看文件夹下的指定后缀的文件

    <?php header("content-type:text/html;charset=utf8"); set_time_limit(0); $dir = "d: ...

  9. Python不同版本打包程序为.exe文件

    安装pyinstaller 测试用的python环境是3.6.2版本 下载地址 https://github.com/pyinstaller/pyinstaller/ 1.打开cmd,切到pyinst ...

  10. Libra教程之:Transaction的生命周期

    文章目录 Transaction的生命周期 提交一个Transaction 交易入链的详细过程 接收Transaction 和其他Validators共享这个Transaction 区块Proposi ...