RxHttp ,比Retrofit 更优雅的协程体验

RxHttp是一个针对Android的网络库,提供了比Retrofit更优雅的协程体验。虽然在稳定性上稍逊于Retrofit,但其易用性和功能丰富度相当。文章介绍了RxHttp的请求三部曲、BaseUrl处理、业务code统一判断、操作符使用、文件上传下载、协程开启及关闭和多任务处理等方面,强调了其在协程环境下的便利性。通过示例代码展示了如何使用RxHttp进行网络请求和错误处理,便于开发者快速上手。
摘要由CSDN通过智能技术生成

1、前言

一直有人问我,RxHttp跟Retrofit相比有什么优势?在这,我想通过稳定性、功能性、易用性几个方面来谈谈我的想法。

首先我声明一点,RxHttp的出现,并不是要干掉谁,而是给大家多一个选择,多一个不一样的选择。

稳定性

我一直认为Retrofit,是当下综合得分最高的选手,RxHttp也很优秀,但得分比Retrofit低那么一丢丢,那这一丢丢差在哪里呢?就差在稳定性这一块,毕竟Retrofit是全球知名的项目,github 上 37k+ star,稳定性肯定不用说,反观RxHttp,才2.6k+ star,仅在国内小有名气。

稳定性不如Retrofit,但不代表RxHttp就不稳定,截止2020-12-27日,RxHttp在github上的提交已超过1000次,关闭的issue数量超过200个,发布的版本超过40个,虽然这些数据不能直接表明一个项目的稳定性,但也能作为一个参考,个人感觉,这对于一个仅开源1.5年的项目来说,已经非常不错了,可以说,RxHttp已经非常稳定了,有问题我都会积极修复。

功能性

其实功能都实现,无非是实现的方式不一样而已,这个没什么好说的,曾经看到过国内某某某网络框架,把Retrofit说的一无是处,说Retrofit这功能没有,那功能没有(实际上都有),然后把自己的说的高大上,不知道是不了解Retrofit还是故意这么干,在我看来,这种特意贬低别人,抬高自己的行为,是无耻的。

易用性

在易用性,个人认为,RxHttp就是神一般的存在,无论你是加密请求、上传、下载、进度监听、失败重试、动态Baseurl、自定义解析器等等任意请求场景,皆遵循请求三部曲,只要记住请求三部曲,就掌握了RxHttp精髓,写请求代码就会游刃有余,特别是对于新人来说,非常的友好,可以快速的上手。

反观Retrofit,很多场景,我们都需要再次封装才能更好的使用,比如,文件上传/下载/进度监听等等,而且Retrofit多达20几个注解,对新人来说着实不太友好,对于老手,有时也会忘记某个注解是干嘛用的,再有就是多个注解非法在一起使用时,只有在编译期间才能给我们明确的错误,这也是我刚上手Retrofit比较头疼的一点。

综上所述

RxHttp易用性远胜Retrofit,但稳定性不如Retrofit,功能上都能实现,算打个平手。

RxHttp&RxLife交流群(群号:378530627,经常会有技术交流,欢迎进群)

本文仅介绍RxHttp + 协程的使用,更多功能请查看

RxHttp 让你眼前一亮的Http请求框架

RxHttp 完美适配Android 10/11 上传/下载/进度监听

RxHttp 全网Http缓存最优解

gradle依赖

1、必选

jitpack添加到项目的build.gradle文件中,如下:

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

注:RxHttp 2.6.0版本起,已全面从JCenter迁移至jitpack

//使用kapt依赖rxhttp-compiler时必须
apply plugin: 'kotlin-kapt'

android {
    //必须,java 8或更高
    compileOptions {
        sourceCompatibility JavaVersion.VERSION_1_8
        targetCompatibility JavaVersion.VERSION_1_8
    }
}

dependencies {
    implementation 'com.squareup.okhttp3:okhttp:4.9.1'
    implementation 'com.github.liujingxing.rxhttp:rxhttp:2.7.3'
    kapt 'com.github.liujingxing.rxhttp:rxhttp-compiler:2.7.3' //生成RxHttp类,纯Java项目,请使用annotationProcessor代替kapt
 }

2、可选

android {
    kapt {
        arguments {
            //依赖了RxJava时,rxhttp_rxjava参数为必须,传入RxJava版本号
            arg("rxhttp_rxjava", "3.1.1")  
            arg("rxhttp_package", "rxhttp")  //指定RxHttp类包名,非必须
        }
    }
    //如果项目未集成kotlin,通过javaCompileOptions方法传参,在defaultConfig标签下
    annotationProcessorOptions {
        arguments = [
            rxhttp_rxjava: '3.1.1',
            rxhttp_package: 'rxhttp'
        ]
    }
}
dependencies {    
    //rxjava2   (RxJava2/Rxjava3二选一,使用asXxx方法时必须)
    implementation 'io.reactivex.rxjava2:rxjava:2.2.8'
    implementation 'io.reactivex.rxjava2:rxandroid:2.1.1'
    implementation 'com.github.liujingxing.rxlife:rxlife-rxjava2:2.2.1' //管理RxJava2生命周期,页面销毁,关闭请求

    //rxjava3
    implementation 'io.reactivex.rxjava3:rxjava:3.1.1'
    implementation 'io.reactivex.rxjava3:rxandroid:3.0.0'
    implementation 'com.github.liujingxing.rxlife:rxlife-rxjava3:2.2.1' //管理RxJava3生命周期,页面销毁,关闭请求

    //非必须,根据自己需求选择 RxHttp默认内置了GsonConverter
    implementation 'com.github.liujingxing.rxhttp:converter-fastjson:2.7.3'
    implementation 'com.github.liujingxing.rxhttp:converter-jackson:2.7.3'
    implementation 'com.github.liujingxing.rxhttp:converter-moshi:2.7.3'
    implementation 'com.github.liujingxing.rxhttp:converter-protobuf:2.7.3'
    implementation 'com.github.liujingxing.rxhttp:converter-simplexml:2.7.3'
}

如果你现在对协程还一知半解,没有关系,那是因为你还没有找到运用场景,而网络请求正是一个很好的切入场景,本文会教你如何优雅,并且安全的开启协程,以及用协程处理多任务,用着用着你就会了。

2、RxHttp 协程使用

2.1、请求三部曲

用过RxHttp的同学知道,RxHttp发送任意请求皆遵循请求三部曲,如下:

1.jpg

代码表示

//Kotlin 协程
val str = RxHttp.get("/service/...") //第一步,确定请求方式,可以选择postForm、postJson等方法
    .toStr()    //第二步,确认返回类型,这里代表返回String类型
    .await()    //第三步,使用await方法拿到返回值
    
//RxJava
RxHttp.get("/service/...") //第一步,确定请求方式,可以选择postForm、postJson等方法
    .asString()            //第二步,使用asXXX系列方法确定返回类型
    .subscribe(s -> {      //第三步, 订阅观察者
        //成功回调
    }, throwable -> {
        //失败回调
    });

注: await()是suspend挂断方法,需要在另一个suspend方法或协程环境中调用

协程请求三部曲详解

  • 第一步,选择get、postForm、postJson等方法来确定请求方式,随后便可通过add、addFile、addHeader等方法来添加参数、文件、请求头等信息

  • 第二步,调用toXxx系列方法来确定返回类型,常用的有toStr、toClass、toList,随后便可调用asFlow、retry、timeout、flowOn、filter、distinct、sort等30余个操作符来执行不同的业务逻辑,本文后续会一一介绍

  • 第三步,最后,只需调用await、tryAwait、awaitResult这三个中的任一操作符获取返回值即可,这一步,需要在协程环境中才能调用

接着,如果我们要获取一个Student对象或者List<Student>集合对象等等任意数据类型,也是通过await()方法,如下:

//Student对象
val student = RxHttp.get("/service/...")
    .toClass<Student>()
    .await()
    
//List<Student> 对象   
val students = RxHttp.get("/service/...")
    .toClass<List<Student>>()
    .await()

注:toClass()方法是万能的,你可以传递任意数据类型过去

以上就是RxHttp在协程中最常规的操作,掌握请求三部曲,就掌握了RxHttp的精髓

2.2、BaseUrl处理

RxHttp通过@DefaultDomain、@Domain注解来配置默认域名及非默认域名,如下:

public class Url {

    @DefaultDomain //通过该注解设置默认域名
    public static String BASE_URL = "https://www.wanandroid.com";
    
    // name 参数在这会生成 setDomainToGoogleIfAbsent方法,可随意指定名称
    // className 参数在这会生成RxGoogleHttp类,可随意指定名称
    @Domain(name = "Google", className = "Google")
    public static String GOOGLE = "https://www.google.com";
}

以上配置www.wanandroid.com为默认域名,www.google.com为非默认域名

多BaseUrl处理

//使用默认域名发请求
RxHttp.get("/service
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值