接入说明:项目中已集成RXjava,RXandroid。Retrofit,为避免包冲突,不须要再次接入。

就可以直接使用RXjava,Retrofit的所有api.

github地址:https://github.com/hunanqi/Retrofit_Two

第一步:在项目的gradle文件里:

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

第二步:在app的gradle文件里。

dependencies {
compile 'com.github.hunanqi:Retrofit_Two:1.0.0'
}

第三步使用:

  Flowable<T> flowable1 = RetrofitUtils.getFlowable("http://apis.juhe.cn/", "mobile/get", user, tClass);
Flowable<T> tFlowable = flowable1.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe();
參数说明:第一个是基本地址,第二个是server地址,此处完整的地址是:http://apis.juhe.cn/mobile/get  

第三个是请求实体类。属性必须全为public,第四个是server返回的json数据相应的实体类。

也可像以下样例中的使用方式,建立一个NetWork网络请求管理类方便管理。

1.測试接口的说明

请求地址:http://apis.juhe.cn/mobile/get?

phone=13429667914&key=您申请的KEY

返回数据演示样例:

{
"resultcode":"200",
"reason":"Return Successd!",
"result":{
"province":"浙江",
"city":"杭州",
"areacode":"0571",
"zip":"310000",
"company":"中国移动",
"card":"移动动感地带卡"
}
}

2.封装过后的使用(UserEntity表示请求实体类,此处有2个參数,DataEntity:返回数据的实体类,如上json 数据创建的实体类)

//网络測试
private void http() {
UserEntity user = new UserEntity();
user.phone = "13438284220";
user.key = "6fe9a2f9cc05e6941bcc45e30a32e51a";
NetWork.query(user,DataEntity.class).subscribe(new Consumer<DataEntity>() {
@Override
public void accept(DataEntity dataEntity) throws Exception {
Toast.makeText(MainActivity.this, dataEntity.getResult().getCity(), Toast.LENGTH_SHORT).show();
}
}, new Consumer<Throwable>() {
@Override
public void accept(Throwable throwable) throws Exception {
Log.i("sss",throwable.toString());
Toast.makeText(MainActivity.this, "网络连接失败", Toast.LENGTH_SHORT).show();
}
});
}

说明:第一个内部类是为了处理数据,第二个是处理网络异常的信息。參数方面第一个參数是请求实体类。第二个是server返回的json数据的实体类

注意事项:请求实体类中的属性由于反射的原因,必须所有写成public。

(1).创建网络请求管理类3.封装思路(由外向内)

/**
* Created by 胡楠启 on 2017/2/24.
* Function:
* Desc: 网络请求管理类
*/
public class NetWork {
//查询手机号码的归属地
public static <T> Flowable<T> query(UserEntity user,Class<T> tClass) {
Flowable<T> flowable1 = RetrofitUtils.getFlowable("http://apis.juhe.cn/", "mobile/get", user, tClass);
Flowable<T> tFlowable = flowable1.subscribeOn(Schedulers.io()).observeOn(AndroidSchedulers.mainThread());
return tFlowable;
}
}

说明:此处依据server接口个数,把所有的接口详细细节创建在这里,方便调用管理。此处详细的作用,确定接口的URL。确定代码执行线程。以及接口回调后的执行线程,

每个server接口都须要写一个相应的參数并配置參数。

切割线------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(2)初始化retrofit

/**
* Created by 胡楠启 on 2017/2/24.
* Function:
* Desc:
*/ public class RetrofitUtils {
public static<T> Flowable<T> getFlowable(String baseurl, String url, Object bin, final Class<T> tClass){
//得到包括參数的map集合
HashMap<String, String> maps = MapUtils.getValuesHash(bin.getClass(), bin);
//retrofit初始化
retrofit2.Retrofit retrofit = new retrofit2.Retrofit.Builder()
.baseUrl(baseurl)
.client(getOkHttp())//添加OKhttp设置生效
//添加返回值为String的支持
.addConverterFactory(ScalarsConverterFactory.create())
//添加返回值为Gson的支持(以实体类返回)
.addConverterFactory(GsonConverterFactory.create())
//支持RXjava
.addCallAdapterFactory(RxJava2CallAdapterFactory.create())
.build();
RetrofitInterface retrofitInterface = retrofit.create(RetrofitInterface.class);
Flowable<String> flowable = retrofitInterface.getData(url, maps);
Flowable<T> map = flowable.map(new Function<String, T>() {
@Override
public T apply(String s) throws Exception {
Gson gson = new Gson();
T t = gson.fromJson(s, tClass);
return t;
}
});
return map;
}
/**
* 设置OKhttp的參数,打印网络请求详情
*/
private static OkHttpClient getOkHttp(){
HttpLoggingInterceptor loggingInterceptor = new HttpLoggingInterceptor(new HttpLoggingInterceptor.Logger() {
@Override
public void log(String message) {
//打印retrofit日志
Log.i("RetrofitLog","retrofitBack = "+message);
}
});
loggingInterceptor.setLevel(HttpLoggingInterceptor.Level.BODY);
OkHttpClient client=new OkHttpClient.Builder().addInterceptor(loggingInterceptor).build();
return client;
} }

说明:此处首先把实体类通过反射转换成map格式的数据,然后初始化Retrofit,的设置,然后依据接口得到observable 。当中getOkHttp此处目的是为了打印出网络请求的具体信息,包含请求地址,post数据,返回数据等,须要在gradle中增加下面依赖:

retrofit 接口详情:

public interface RetrofitInterface {
@POST
Flowable<String> getData(@Url String url, @QueryMap HashMap<String,String> map);
}

说明:此处Observable能够设置返回详细的类型。

@POST
Observable<DataEntity> getData(@Url String url, @QueryMap HashMap<String,String> map);

免除后期NetWork类中将String解析成详细的实体类的操作。retrofit会自己主动返回DataEntity类,可是假设固定死了此处的泛型,那么每个后台的接口,就须要在这里相应的写一个Retrofit的接口。

所以此处採用String类型,再在NetWork类中进行map操作符 转换成DataEntity类。

假设须要。这里整个app仅仅写一个接口,且兴许不再retrofit自己主动返回实体类,不用像此处NetWork类手动解析,有待兴许研究。

(3)关于实体类转化为map数据。

public class MapUtils {

    /**
* 把请求实体类里面的參数取出来,然后放入hashmap中
* @param clazz
* @param object
* @return
*/
public static HashMap<String,String> getValuesHash(Class<? > clazz,Object object){
HashMap<String,String> result=new HashMap<String,String>();
if(object.equals(null))return result;
Field[] field = clazz.getFields();
for(Field f : field){
if ("serialVersionUID".equals(f.getName()))
continue;
try {
Object value=f.get(object);
if(value!=null){
result.put(String.valueOf(f.getName()),String.valueOf(value));
}
} catch (IllegalAccessException e) {
e.printStackTrace();
} catch (IllegalArgumentException e) {
e.printStackTrace();
} }
return result;
}

备注:以上就是Retrofit简单post请求的简单封装思路。很多其它需求。可依据rtetrofit的配置,特殊处理。假设须要设置请求头信息可在

@POST
Flowable<String> getData(@Url String url, @QueryMap HashMap<String,String> map);这里加入@Headers 注解。

retrofit+RXjava二次封装的更多相关文章

  1. 优雅地使用Retrofit+RxJava(二)

    前言 在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现非常多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期.我就写写平时我在使用RxJava+Retrofi ...

  2. 【知识必备】RxJava+Retrofit二次封装最佳结合体验,打造懒人封装框架~

    一.写在前面 相信各位看官对retrofit和rxjava已经耳熟能详了,最近一直在学习retrofit+rxjava的各种封装姿势,也结合自己的理解,一步一步的做起来. 骚年,如果你还没有掌握ret ...

  3. Retrofit + RxJava + OkHttp 让网络请求变的简单-基础篇

    https://www.jianshu.com/p/5bc866b9cbb9 最近因为手头上的工作做完了,比较闲,想着做一些优化.看到以前用的那一套网络框架添加一个请求比较麻烦,并且比较难用,所以想改 ...

  4. Android MVP开发模式及Retrofit + RxJava封装

    代码已上传到Github,因为接口都是模拟无法进行测试,明白大概的逻辑就行了! 欢迎浏览我的博客--https://pushy.site 1. MVP模式 1.1 介绍 如果熟悉MVP模式架构的话,对 ...

  5. 基于Retrofit+RxJava的Android分层网络请求框架

    目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及 ...

  6. Android--Retrofit+RxJava的简单封装(三)

    1,继续接着上一篇的讲讲,话说如果像上一篇这样的话,那么我们每一次请求一个结构都要创建一堆的Retrofit对象,而且代码都是相同的,我们可以试试封装一下 先创建一个HttpMethods类,将Ret ...

  7. 结合Retrofit,RxJava,Okhttp,FastJson的网络框架RRO

    Retrofit以其灵活的调用形式, 强大的扩展性著称. 随着RxAndroid的推出, Retrofit这样的可插拔式的网络框架因其可以灵活兼容各种数据解析器, 回调形式(主要还是RxJava啦)而 ...

  8. 设计模式笔记之四:MVP+Retrofit+RxJava组合使用

    本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236866&idx=1&sn=da66 ...

  9. Android 网络请求Retrofit + RxJava

    一.背景 经常看到项目用Retrofit+RxJava+RxAndroid的框架,为了看懂项目的结构.现在来了解一下,Retrofit: Retrofit是Square 公司开发的一款正对Androi ...

随机推荐

  1. Google Reader明日关闭:14款替代品对比

    北京时间6月30日上午消息,谷歌将于7月1日关闭RSS阅读器服务Google Reader,目前许多用户已转向其他的RSS阅读器服务. 美国科技博客Marketing Land本周对市面上多个RSS阅 ...

  2. 使用CefSharp在.Net程序中嵌入Chrome浏览器(四)——启动优化

    在实际使用过程中,发现有的客户端会出现chrome加载网页过慢问题,定位后发现很多是因为设置系统代理所致,此时可以通过如下启动参数禁止系统代理. {"proxy-auto-detect&qu ...

  3. One-wire Demo on the STM32F4 Discovery Board

    One-wire Demo on the STM32F4 Discovery Board Some of the devs at work were struggling to get their s ...

  4. 微信图片生成插件,页面截图插件 html2canvas,截图失真 问题的解决方案

    html2canvas 是一个相当不错的 JavaScript 类库,它使用了 html5 和 css3 的一些新功能特性,实现了在客户端对网页进行截图的功能.html2canvas 通过获取页面的 ...

  5. [Go] Http / Net 相关资料

    [astaxie] [基础]GO搭建一个简单的Web服务器 [astaxie] Go如何使得Web工作 [astaxie] Go 的 Http 包详解 [叶剑峰] Go语言_HTTP包 [叶剑峰] 使 ...

  6. 用 CSS 实现三角形与平行四边形

    最近在逛某个技术网站的时候,感觉文章关键词上的样式好酷炫啊.于是我将那种写法照搬到了我的博客中,也许最近逛过我博客的小伙伴已经发现了它出现在哪儿了——分页的样式.来张截图: 你在首页的底部也可以看到这 ...

  7. CSS background-position用法

    相信很多喜欢研究网页界面的童鞋都遇到过一个奇妙的现象:网页中很多图片素材被合成在一张图片上. 起初小菜模仿网站的时候,经常遇到这个现象,那时候也不知道这时什么技术,人家的整张图片素材不会利用,只能用p ...

  8. iphone6/6+ 适配心得

    1.     文档综述 自iphone6/6+发布,ios屏幕分辨率的种类一下从2种变成了四种.对于以前很多手写UI,并且使用绝对坐标的UI,可能会发生异变,本文主要介绍在纯手写UI条件下,ios应用 ...

  9. WordPress主题开发:设置和获取浏览次数

    将以下代码放在functions.php,一个是获取阅读量,一个是设置阅读量 <?php /** * getPostViews()函数 * 功能:获取阅读数量 * 在需要显示浏览次数的位置,调用 ...

  10. Java文件管理系统

    上一个版本设计参照了 windows 资源管理器的原则,使用了多年.也发现了少许问题,也许是我们应用场景不一样... 目前的设计结合了目前的云概念.目录采用的是虚拟方式和实际的目录无关,只是存在一定的 ...