Rxjava2+Retrofit2网络框架傻瓜式接入指南

RxJava2+Retrofit2快速接入指南 本文主要是介绍本人在项目中接入Rxjava2和Retrofit2的过程中的一些经验心得、遇到的问题,特别是本人的学习曲线,希望能帮助到你。主要的概念介绍涉及较少,但是在文中会给出我在接入的过程中参考过的文章。 阅读详情

前言

本文主要是介绍本人在项目中接入Rxjava2和Retrofit2的过程中的一些经验心得、遇到的问题,特别是本人的学习曲线,希望能帮助到你。主要的概念介绍涉及较少,但是在文中会给出我在接入的过程中参考过的文章。
之所以把Rxjava2放在前面是因为,我最开始的时候只想接入Rxjava2来体验高大上的响应式编程,但是在学习和接入Rxjava2的过程中,感觉到非常有必要将Retrofit也整合进来,Retrofit的API设计非常适合Rxjava,两者结合使用是最完美的,于是就在项目中同时引用了Rxjava2+Retroif2。从学习到最后完成接入大概耗时5天以上。在这个过程中,自己的编程思想得到了很大的锻炼和提高,从最后使用的结果来看,框架极大的简化了平时做网络请求的步骤,特别是做到了代码的解耦,极大的提高了代码的可阅读性。

在动手之前,建议大家先对MVP模式(http://www.cnblogs.com/changyiqiang/p/6044618.html)、
面向接口编程(http://blog.sina.com.cn/s/blog_6c969b4a0102vnh6.html)有一定认识,
对Retrofit2和Rxjava2(文中用RR代替)有一些基本的了解。
RxJava2.0教程(一)
http://www.jianshu.com/p/464fa025229e.
我所理解的RxJava——上手其实很简单
http://www.jianshu.com/p/5e93c9101dc5

Ok,所谓万事开头难,如果有想法的同学的一定要尽早开始。让我们从导包开始一步步搭建自己的RR框架:

添加Gradle配置:

compile 'io.reactivex.rxjava2:rxjava:2.0.6'   
compile 'io.reactivex.rxjava2:rxandroid:2.0.1'
compile 'com.squareup.retrofit2:retrofit:2.2.0'
compile 'com.squareup.retrofit2:adapter-rxjava2:2.2.0'  
compile 'com.squareup.retrofit2:converter-gson:2.2.0'   
compile 'com.squareup.okhttp3:logging-interceptor:3.6.0' 

根据后台提供的接口创建实体类

public class PayMoneyEntity {
    float money ;

    public float getMoney() {
        return money;
    }

    public void setMoney(float money) {
        this.money = money;
    }
}

这里推荐两个的插件:
使用GsonFormat可以根据JSON快速生成实体类
http://blog.youkuaiyun.com/dakaring/article/details/46300963
使用Android parcelable code generator可以快速得序列化对象
http://blog.youkuaiyun.com/kroclin/article/details/40902721

创建Retrofit对象:

1、先写一个抽象类:

public abstract class BaseService {
    protected  abstract  String getBaseUrl();
    protected Retrofit baseRetrofit(){
        OkHttpClient client=new OkHttpClient.Builder()
                .addInterceptor(new AddPubicParamsInterceptor())//自定义的拦截器,用于添加公共参数
                .addInterceptor(new HttpLoggingInterceptor().setLevel(HttpLoggingInterceptor.Level.BODY))//拦截器,用于日志的打印
                .build();

        Retrofit retrofit=new Retrofit.Builder()
                .client(client)
                .baseUrl(getBaseUrl())
                .addConverterFactory(MyConvert.create())//对获得的结果进行解析和处理,是比较重要的部分,在我的项目中涉及到解密和一些业务逻辑判断
                .addConverterFactory(GsonConverterFactory.create())//默认直接转化为实体类,不会进行解密等处理
                .addCallAdapterFactory(RxJava2CallAdapterFactory.create())//Retrofit2与Rxjava2之间结合的适配器
                .build();
        return  retrofit;
    }
}

2、定义网络请求的接口:

public interface GetCustomListApi {

    @GET("sample.client/pay/money")//这里是URL的后半段
    Observable<PayMoneyEntity> getPayInfo(@Query("user_id") String user_id);

}

3、管理Retrofit:

public class RestService extends BaseService {
    private static final String BASE_REST_URL = "http://www.baidu.cn:80";//这里是URL的前半段
    @Override
    protected String getBaseUrl() {
        return BASE_REST_URL;
    }
    public GetCustomListApi creatCustomApi(){
        return baseRetrofit().create(GetCustomListApi.class);
    }
}

1、首先我们来看一下Interceptor:
关于拦截器的介绍大家参考:
http://blog.youkuaiyun.com/oyangyujun/article/details/50039403

在我们的项目中大部分请求都需要添加公共参数,我们通过自定义的拦截器重写intercept方法即可:

public class AddPubicParamsInterceptor implements Interceptor {

    @SuppressWarnings("deprecation")
    @Override
    public Response intercept(Chain chain) throws IOException {

        Request request = chain.request();
        // 添加公共的新的参数
        HttpUrl.Builder authorizedUrlBuilder = request.url()
                .newBuilder();
        Request.Builder build = request.newBuilder();
        Map<String, Object> globalParams = new HashMap<>();//这里是我们的公共参数,根据自己项目实际情况获得,具体添加什么样的参数,在这里做逻辑判断即可
        Iterator it = globalParams.entrySet().iterator();
        while (it.hasNext()) {
            Map.Entry entry = (Map.Entry) it.next();
            //如果是中文/其他字符,会直接把字符串用BASE64加密,
            String s = URLDecoder.decode(String.valueOf(entry.getValue()));
            authorizedUrlBuilder.addQueryParameter((String) entry.getKey(), s);
        }
    //生成新的请求
        Request newrequest = request.newBuilder()
                .method(request.method(), request.body())
                .url(authorizedUrlBuilder.build())
                .build();

        return chain.proceed(newrequest);
    }
}


2、在定义网络请求接口大家参考:
Retrofit2.0 API使用解析
http://blog.youkuaiyun.com/zuck_t/article/details/50718774/
Android网络请求库 - Say hello to retrofit
http://blog.youkuaiyun.com/ghost_Programmer/article/details/52372065

这里当时我花费了比较多的时间,因为要找到适合自己项目的URL写法。

3、到了这一步我们终于把请求处理完了,最后让我们来看一下解析GsonConverterFactory——转换器,参考:
Retrofit 2.0 自定义Converter
http://blog.youkuaiyun.com/jdsjlzx/article/details/51860663

这里的解析处理也是耗了比较多的时间,特别是遇到一个奇葩的问题非常正常的一行代码一直编译不通过,

 TypeAdapter<?> adapter=gson.getAdapter(TypeToken.get(type));

后来重新安装了AS就没有再现了。来看代码:

public final class MyConvert extends Converter.Factory {
    private final Gson gson;

    public static MyConvert create(Gson gson) {
        return new MyConvert(gson);
    }
    public  static MyConvert create(){
        return create(new Gson());
    }

    public MyConvert(Gson gson) {
        this.gson = gson;
    }

    @Override
    public Converter<ResponseBody, ?> responseBodyConverter(Type type, Annotation[] annotations, Retrofit retrofit) {
        TypeAdapter<?> adapter=gson.getAdapter(TypeToken.get(type));
        return new DecodeResponseBodyConverter<>(gson,adapter);
    }

    @Override
    public Converter<?, RequestBody> requestBodyConverter(Type type, Annotation[] parameterAnnotations, Annotation[] methodAnnotations, Retrofit retrofit) {
        TypeAdapter<?> adapter=gson.getAdapter(TypeToken.get(type));
        return new RequestBodyConverter<>(gson, adapter);
    }
}

public class DecodeResponseBodyConverter<T> implements Converter<ResponseBody, T>  {
    private final TypeAdapter<T> adapter;
    private final Gson gson;

    DecodeResponseBodyConverter(Gson gson, TypeAdapter<T> adapter) {
        this.adapter = adapter;
        this.gson = gson;
    }

    @Override
    public T convert(ResponseBody responseBody) throws IOException {
        try {
            String s = responseBody.string();
            //s就是我们网络请求获得的字符串了,因为我们项目中以前的网络框架用到了把字符串封装为Response对象,为了保持一致和方便维护这里也继续使用Response对象。大家根据自己项目具体情况处理即可。
            Response response=new Response(s);
            //response.content是消息体,这里进行解密处理
            String decodeBody = Utils.decode(response.content, true);

            JsonReader jsonReader = gson.newJsonReader(new StringReader(decodeBody));
            return adapter.read(jsonReader);
        }  finally {
            responseBody.close();
        }

}


自定义的RequestBodyConverter跟GsonConverterFactory中用到的GsonRequestBodyConverter一样,就不贴代码了。

Rxjava2+Rtrofit2完成网络请求:

public class TestActivity extends Activity {
    private GetCustomListApi customListApi = new RestService().creatCustomApi();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        customListApi.getPayInfo(UserDataUtils.getInstance().getUser_id())
                .subscribeOn(Schedulers.io())//线程控制
                .observeOn(AndroidSchedulers.mainThread())
                .subscribe(new Observer<PayMoneyEntity>() {
                    @Override
                    public void onSubscribe(Disposable d) {

                    }
                    @Override
                    public void onNext(PayMoneyEntity payMoneyEntity) {
                        payMoneyEntity.getMoney();
                    }
                    @Override
                    public void onError(Throwable e) {
                    }
                    @Override
                    public void onComplete() {
                    }
                });
    }

}

线程控制Scheduler 的原理:
http://blog.youkuaiyun.com/qq_28195645/article/details/52564494

在OnNext方法中我们就得到了经过解析后的实体类,可以getMoney了,享受长长的准备工作后的成果吧。

结语:

我自己在接入RR框架的过程中确实对自己的编程思想有非常大的提升,也希望更多的人能掌握RR框架的使用,写出更简洁优雅的代码。

小米汽车车载多摄像头视频链路深度解析 | MAX96792/MAX96724/MAX96781 实战分享 通过合理的输入输出规划 + 虚拟通道管理 + 加串行策略,可以在成本和性能之间取得最佳平衡,这就是多摄像头系统设计的核心精髓。 阅读详情

相关推荐

习题6-3 使用函数输出指定范围内的完数

其中函数factorsum须返回int number的因子和;函数PrintPN要逐行输出给定范围[mn]内每个完数的因子累加形式的分解式,每个完数占一行,格式为“完数 = 因子1 + 因子2 + ... + 因子k”,其中完数和因子均按递增顺序给出。如果给定区间内没有完数,则输出一行“No perfect number”。

cutto的博客 863

【RxJava】RxJava 基本用法 ( 引入 RxJava 依赖 | 定义 Observer 观察者 | 定义 Observable 被观察者 | 被观察者订阅观察者 )

一、RxJava 基本用法 1、引入 RxJava 依赖 2、定义 Observer 观察者 3、定义 Observable 被观察者 4、Observable 被观察者订阅 Observer 观察者 二、代码示例

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2566

如何在Ubuntu 22.04上为AlphaFold3配置NVIDIA A100 GPU(含驱动安装避坑指南)

本文提供了在Ubuntu 22.04系统上为AlphaFold3部署NVIDIA A100 GPU的完整安装教程。内容涵盖从系统环境准备、NVIDIA驱动安装与避坑指南,到Docker容器化部署、数据库获取以及最终构建运行AlphaFold3的详细步骤,旨在帮助研究者和开发者高效配置高性能计算环境,充分发挥A100的硬件潜力。

nft7creator的博客 468

Android Retrofit+RxJava接入(三)

前面两篇文字介绍了,Retrofit的简单使用,该文章则使用Retrofit+Rxjava 来实现请求。 首先导入 compile 'com.google.code.gson:gson:2.8.0' //=========Retrofit========= compile 'com.squareup.retrofit2:retrofit:2.2.0' //转...

Kenway090704的博客 726

伯德图详解:从传递函数到系统稳定性的频域分析

在自动控制与控制系统设计中,理解系统对不同频率输入信号的响应特性,是分析和设计稳定系统的核心基础。频率响应描述了系统对正弦输入的幅值增益与相位变化规律,而伯德图作为最直观的频域分析工具,通过对数坐标将宽频带特性压缩成一条清晰曲线,让工程师无需复杂计算即可快速评估系统性能。从典型环节的渐近线绘制,到相位裕度、幅值裕度的读取,伯德图贯穿了系统稳定性判断、控制器参数整定及噪声抑制等关键场景。本文结合实际调试经验,系统讲解伯德图的绘制原理与读图方法,帮助读者快速掌握从传递函数到工程应用的核心技能。

weixin_34535286的博客 338

基于deepseek+dify+达梦实现自然语言查询数据库

自然语言查询数据库信息

weixin_43974943的博客 1593

android--RXJava详细使用篇

人性的背后是白云苍狗,愿我们都能做生活的高手

袁震的博客 4556

C语言设计模式全面解析:从理论到28个实战示例

本文系统介绍了23种经典设计模式在C语言中的实现方法。通过结构体、函数指针等技巧,C语言可以优雅地模拟面向对象特性,实现代码复用与解耦。文章分类详解了创建型、结构型、行为型三大类模式,并提供了28个完整代码示例,包括单例、策略、观察者等核心模式的精简实现。这些模式在嵌入式系统、操作系统内核等场景中广泛应用,如状态机、事件驱动等。学习C语言设计模式的关键在于理解模式意图,掌握函数指针和结构体组合等技巧,并在实际项目中灵活运用。本文为C语言开发者提供了全面的设计模式参考指南。

数字人生 364

【Android】Retrofit2和RxJava2新手快速上手

网上关于Retrofit2和RxJava2的博客特别多,但是内容特别复杂,一上来就讲解很高级的用法。所以这篇博客的主要目的,只是为了讲解一下核心用法,对于不求甚解的新手来说,看完基本已经够用了。因为博客本身是脱离具体应用环境的,很难通过文字把每个点讲得透彻,大可不必太过追求面面俱到。observeOn 指定接收事件的线程,这里是网络请求执行成功,处理回复数据的线程。subscribeOn 指定订阅事件的线程,这里是执行网络请求的线程。onSubscribe 事件被订阅,这里是即将开始执行网络请求。

天天向上 Up Up Up (*^▽^*) 799

《点云进阶》专栏文章目录

点云进阶》专栏文章目录

点云侠的博客 4905

YOLO26涨点改进 | 全网独家,注意力创新改进篇 | Arxiv2025 | YOLO26引入MSLA多尺度线性注意力模块,高效提取多尺度特征和建模长程依赖,含多种创新改进,助力有效涨点

本文提出了一种多尺度线性注意力模块(MSLA)来优化YOLO26模型。MSLA通过并行使用不同尺寸的深度可分离卷积(3×3至9×9)提取多尺度特征,并结合线性注意力机制高效建模全局依赖关系。该模块显著提升了模型对多尺度目标的检测能力,同时保持了轻量化特性。实验表明,MSLA能有效增强小目标检测和复杂场景下的分割精度。文章详细介绍了MSLA的网络结构、核心优势及实现代码,并提供了两种集成MSLA的YOLO26改进方案,为实时目标检测任务提供了高效解决方案。

Ai缝合怪、助力小伙伴高效发论文 300

【基于HTTP的远程调用框架 一】深度详解Retrofit2框架概念和使用

Retrofit2其实是一个非常好的优化体验的框架,其核心还是调用OkHttp框架进行网络接口请求,其最大的好处就是让我们调用网络接口就像调用普通接口一样方便,通过各种注解方便的进行网络请求。通过源码的学习知道了其其实是通过动态代理实现的,动态代理还帮我们搞定了MyBatis框架、AOP,可见知道一种技术原理其收益远大于知道一种简单的框架使用,而一种技术原理又来自于一种技术思想,由此可推,知道一种技术思想>知道一种技术原理>知道一种框架使用

MaoLin Tian's Blog 2233

【OpenClaw从入门到精通】第19篇:OpenClaw电商实战:从零搭建比价+库存监控+自动调价全自动化系统(2026实测附完整代码)

2026年OpenClaw成为全球最火开源项目,电商行业因其场景高频、数据标准化成为其核心落地领域。本文针对电商从业者面临的比价繁琐、库存混乱、调价滞后三大痛点,基于OpenClaw的“接入层-执行层-决策层”三层架构,从零拆解智能比价、多平台库存监控、动态自动调价三大核心场景的实现逻辑。文中包含完整的环境配置、技能安装、代码实现(含Python脚本与YAML配置)、执行结果验证,同时补充关键算法原理与避坑指南,兼顾新手入门与进阶提升。读者可直接参考本文实操流程,快速搭建属于自己的电商自动化系统,实现7×2

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 2239

优雅封装Retrofit2+Rxjava2并慵懒的使用KilleTom_RetrofitClientMaster

久违一篇博客,最近进了一家比较大的公司,由于结束了自由开源所以时间会比较紧张,但是还存在一些充裕的时间去开源一些东西如:KilleTomRxMaterialDesignUtil 。 最近刚刚把RetrofitClient1.0版本封装好的一个Retrofit库已经可以开源使用有兴趣的可以去了解一下; 重点来了: 先来看看比较传统使用封装代码: public class AppNetCli...

易庞宙的博客 1万+

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

傻瓜式使用Retrofit+RxJava进行网络请求

网上已经有很多很优秀的Retrofit教程了,但是再怎么也是别人的。要想自己在需要的时候,可以傻瓜式找出来按着上面的来抄就可以了的文章,恐怕必须要自己写一个了。开始:(1)既然是网络框架,那么首先就要添加网络权限&lt;uses-permission android:name="android.permission.INTERNET" /&gt;(2)添加依赖compile 'com.square...

从现在开始认真学习的博客 306

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

android练手项目集锦

哈哈一向的老传统,直接贴地址。话说现在各种开源项目不少,但是现在找几个优秀的还真不容易 awaker 一个挺不错的用来学习 AAC 框架的demo ,很详细的使用了 AAC 框架,代码封装的不错。个人感官,AAC 框架使用的有些畏手畏脚,很中规中矩,AAC 参与获取数据,刷新页面显示,没有探讨更深入的用 AAC 把 app 架构向数据,事件流方向修改。另外数据层中有些职责不清晰,在 r...

希哈科技 1745

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android通用开发笔记和高性能安卓开发框架源码

笔记列表 云炬Android开发笔记(准备篇) Android studio及AVD模拟器的安装调试教程 云炬Android开发笔记 2项目初始化 云炬Android开发笔记 3框架主配置的入口的设计和实践 云炬Android开发笔记 4单Activity界面架构设计与验证 云炬Android开发笔记5 高性能傻瓜式网络请求框架设计(Retrofit+RxJava+Glide) 云炬Android开发笔记 6启动图功能开发与封装 云炬Android开发笔记 7登陆注册功能开发 云炬Andr.

科大云炬 1478

MVPArms官方快速组件化方案开源,来自5K star的信赖

MVPArms从两年前开源至今, 已经累积了5k star, 获得了上千个商业项目的信赖和认可回顾两年前, 那时MVPArms还没诞生,MVPDagger2RxjavaRetrofit这些技术在国内才刚刚开始流行, 在网上能搜索到的中文学习资料远没有现在这么丰富, 特别是Dagger, 在网上能搜索到的文章甚至有很多讲的是Square的Dagger1, 学习资料的匮乏加上Dagger2本身就是块硬骨头, 让本人在学习的道路上不知道多走了多少弯路从那时开始, 让初学者都能够快速搭建一个MVP。

wfegre的博客 1033

Rxjava +Retrofit2

Rxjava 不加 Retrofit框架的话使用为 public void rxJavaDownloadImageAction(View view) { // 起点 Observable.just(PATH) // 内部会分发 PATH Stirng // TODO 第二步 // TODO 第三步 .map(new Function<String, Bitmap>() { @Override public Bit.

u013286571的博客 993

Android Room数据库-RxJava&RxAndroid接入

Android Room数据库-RxJava&RxAndroid接入

听海的博客 241

Android Kotlin之Retrofit、Rxjava的使用

一.Retrofit定义: Retrofit是square开源的网络Restful请求框架,底层是基于okhttp的,也就是封装okhttp的一个网络请求框架,是基于java的动态代理来实现的,开发者只要定义接口就可以了。 二.Retrofit特点: 1.底层基于okhttp 2.使用Restful设计风格 3.通过注解配置网络请求 4.支持同步、异步请求 5.支持各种数据解析...

认真做事,开心生活 2086

Retrofit2与RxJava用法大全

Retrofit2是square公司出品的一个网络请求库,网上有很多相关的介绍。我很久以前都想去研究了,但一直都有各种事情耽搁,现在就让我们一起去捋一捋,这篇主要讲解Retrofit2与RxJava的基本用法。 get请求 post请求 文件上传 文件下载 开启日志拦截 与RxJava结合使用 什么是Retrofit2官网是这么介绍的:Retrofit adapts a Java interfac

文淑的博客 2万+

Rxjava+retrofit2+OKHttp+GSON实践

Rxjava+retrofit2+OKHttp+GSON实践网络请求1 添加配置文件//retrofit compile 'com.squareup.retrofit2:retrofit:2.1.0' //Gson converter compile 'com.squareup.retrofit2:converter-gson:2.1.0' //RxJava2 Adapter compile 'co

5ingwings(SiHao)的博客 7308

用kotlin语言实现RxJava2+Retrofit2+MVP做网络框架封装

1.简介 不知道什么时候,kotlin被google指定为官方开发语言,所以学习一下还是有必要的,这里主要说明使用kotlin做网络框架封装。 2.特点 3.说明 本篇博客主要浅显的讲讲如何使用kotlin+RxJava2++Retrofit2+MVP做网络框架封装 4.代码分析 4.1.添加依赖 app下的build.grade文件的目录dependencies下添加 ...

fanhenghao的博客 1930

用Kotlin编写Android:Retrofit+Rxjava尝试

前言: 最近学习了安卓开发谷歌推荐的Kotlin语言,便用来尝试了一下重构之前的MVP+Retrofit+Rxjava的代码,下面是我重构后的Kotlin代码 首先添加gradle的compile: dependencies { compile 'io.reactivex.rxjava2:rxjava:2.0.7' compile 'io.reactivex.rxjava2:rxa...

Lizheng~的博客 970

【RxJava】使用

虽说Rxjava显然已经有些过时了,但是有些公司还在使用,为了能适应更多的业务代码,并提高自己的开发效率,所以这里仅做个Rxjava使用的总结,不涉及Rxjava内部的实现原理。 RxJava的核心就是异步数据流和响应式编程。 我们平时开发过程中的网络请求、数据库读写、文件读写、定时任务等各种耗时操作,都可以使用RxJava来完成。 在平时的开发中,我们可以把所有的事件(数据)我们都可以看成是一条河流,它可以被观察,被过滤等操作,也可以将多条河流汇合成一条新河流。

yang553566463的博客 1225
上一篇: 硬解码和软解码
下一篇: eclipse-导入vitamio并能在自己的程序中使用
至鳟宝
博客等级 码龄10年 21粉丝 62原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值