retrofit+RXjava二次封装

接入说明:项目中已集成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();
参数说明:第一个是基本地址,第二个是服务器地址,此处完整的地址是:http://apis.juhe.cn/mobile/get  

第三个是请求实体类。属性必须全为public,第四个是服务器返回的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();
        }
    });
}

说明:第一个内部类是为了处理数据,第二个是处理网络异常的信息。参数方面第一个参数是请求实体类,第二个是服务器返回的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;
}
}

说明:此处根据服务器接口个数,把全部的接口具体细节创建在这里,方便调用管理。此处具体的作用,确定接口的URL,确定代码运行线程,以及接口回调后的运行线程,

每一个服务器接口都需要写一个对应的参数并配置参数。

分割线------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------

(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 注解。

时间: 2024-12-22 10:15:58

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

优雅地使用Retrofit+RxJava(二)

前言 在我上一篇讲Retrofit+RxJava在MVP模式中优雅地处理异常(一)中,发现很多网友发邮箱给我表示期待我的下一篇文章,正好趁着清明假期,我就写写平时我在使用RxJava+Retrofit怎么去灵活地处理一些场景.比如说一些比较常见的场景: 网络请求过程中token的处理 网络请求数据的加密与解密 为每个请求添加固定的头部,比如说当前版本号,Rsa的密钥等等 规范化每个网络请求,让代码只写一次 我自己平时对代码的简洁性要求非常高,所以retrofit+rxjava正好切中了我的痛点,

Rxjava+ReTrofit+okHttp深入浅出-终极封装

Rxjava+ReTrofit+okHttp深入浅出-终极封装 背景: 学习Rxjava和retrofit已经很长时间了,功能确实很强大,但是使用起来还是有点复杂,代码的重复性太高,所以决定把基于retrofit和rxjava的处理统一封装起来,实现的功能: 1.Retrofit+Rxjava+okhttp基本使用方法 2.统一处理请求数据格式 3.统一的ProgressDialog和回调Subscriber处理 4.取消http请求 5.预处理http请求 5.返回数据的统一判断 效果: 封装

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传)

Rxjava+ReTrofit+okHttp深入浅出-终极封装四(多文件下载之断点续传) 背景 断点续传下载一直是移动开发中必不可少的一项重要的技术,同样的Rxjava和Retrofit的结合让这个技术解决起来更加的灵活,我们完全可以封装一个适合自的下载框架,简单而且安全! 效果 实现 下载和之前的http请求可以相互独立,所以我们单独给download建立一个工程moudel处理 1.创建service接口 和以前一样,先写接口 注意:Streaming是判断是否写入内存的标示,如果小文件可以

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

目前已经有不少Android客户端在使用Retrofit+RxJava实现网络请求了,相比于xUtils,Volley等网络访问框架,其具有网络访问效率高(基于OkHttp).内存占用少.代码量小以及数据传输安全性高等特点. Retrofit源码更是经典的设计模式教程,笔者已在之前的文章中分享过自己的一些体会,有兴趣的话可点击以下链接了解:<Retrofit源码设计模式解析(上)>.<Retrofit源码设计模式解析(下)> 但在具体业务场景下,比如涉及到多种网络请求(GET/PU

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

本博客转自郭霖公众号:http://mp.weixin.qq.com/s?__biz=MzA5MzI3NjE2MA==&mid=2650236866&idx=1&sn=da666831f67303eeb7a57c1591204b43&scene=24&srcid=0910wJAKSLdsEFTBKwKfTNor#wechat_redirect http://blog.csdn.net/qq_27778869/article/details/52121208 MVP

迅速上手Retrofit+RxJava+Okhttp+FastJson的网络框架[RRO]

Retrofit以其灵活的调用形式, 强大的扩展性著称. 随着RxAndroid的推出, Retrofit这样的可插拔式的网络框架因其可以灵活兼容各种数据解析器, 回调形式(主要还是RxJava啦)而更加风靡. 但是! Retrofit2官方虽有一堆集成第三方json解析的实现,比如gson-converter等等..但唯独就是没有FastJson, 这让我很不解..于是自己动手模仿gson-converter写了一个fastjson-converter, 并封装为一个更易用的适合Android

Android-MVP+Retrofit+Rxjava实现一个知乎日报客户端

使用MVP+Retrofit+Rxjava实现一个知乎日报客户端,界面基于Material design,还没有全部完成orz,,放假太懒 效果图 开源项目 name introduction butterknife Annotate fields with @BindView and a view ID for Butter Knife to find and automatically cast the corresponding view in your layout. MaterialT

iOS项目相关@AFN&amp;SDWeb的二次封装

一,AFNetworking跟SDWebImge是功能强大且常用的第三方,然而在实际应用中需要封装用来复用今天就跟大家分享一下AFN&SDWeb的二次封装 1. HttpClient.h及.m .h定义了HTTP常用的四种GET POST PUT DELETE 请求 一般分别用做增删减查 定义前预处理,请求成功处理,请求失败处理的block 及带多参数w的方法声明 .m设置请求类型跟响应类型,监听网络是否有网络,如果没有,弹出网络异常的警示框 2. UIImageView+WebCache.h及

Retrofit+RxJava 优雅的处理服务器返回异常、错误

开始本博客之前,请先阅读: Retrofit请求数据对错误以及网络异常的处理 异常&错误 实际开发经常有这种情况,比如登录请求,接口返回的 信息包括请求返回的状态:失败还是成功,错误码,User对象等等.如果网络等原因引起的登录失败可以归结为异常,如果是用户信息输入错误导致的登录失败算是错误. 假如服务器返回的是统一数据格式: /** * 标准数据格式 * @param <T> */ public class Response<T> { public int state;