RxJava2和Retrofit封装的RetrofitClient2终于来了!

Tamic : http://www.jianshu.com/u/3bbb1ddf4fd5

RxJava2和Retrofit封装的RetrofitClient2终于来了!_第1张图片
Tamic 只出高质量干货

RxJava1和Retrofit2组合的好用的RetrofitClient笔者去年写了一篇,后续有朋友私信要求升级第二版本,本打算 不维护了,但是很多人要用Rxjava2,所以便进行了支持Rxjava2的升级,升级过程中遇到了一些麻烦,经过一段时间的测试后,写了这篇文章,如果想要更要完整的功能请参考Novate.

RxJava1:

RxJava+retrofit的请参考:
Android基于Retrofit2.0+RxJava 封装的超好用的RetrofitClient工具类

写在最前:

本次封装的优势:

  • 避免重复创建Retrofit实列.

  • 调用方便简洁.

  • 无需重复设置属性的步骤.

  • 可固定配置 Host 也可动态配置Url、请求头、参数等.

  • 支持文件下载和上传.

  • 支持json,表单形式提交.

  • 支持扩展APIService

  • 统一处理无网络情况,和支持加载进度

  • 支持缓存机制,cookie同步

  • 优化取消功能

本次我使用的是最新Rxjava2.1, Retrofit 2.3, okhttp3.8 进行开发的。其他版本差异请看官方说明。

实现的过程可以看第一篇详细介绍!这里不在累赘,但值得注意的是 RxJava2最大的优势就是增加了背压和 Flowable,收回Obserable权限等,除了包名发生变化,一些类名也进行了改变,比如:Func就变成了了Funtion, Action变为Customer, Transformer 变为 FlowableTransformer 还有支持了Map操作符升级的数组泛型支持的mapArray等。

其他优势可以去RxAava 的GItHub阅读:
https://github.com/ReactiveX/RxJava

Retrfoit在最新的版本中也发生了变化,@PartMap将不支持注解Key指,提供了另一种方式@partList等, 这种方式可以让多文件上传变得更加灵活:

public interface UpLoadApiService {
  
    @GET("service/upload")
    Flowable> upload(
     @PartList   List list);
}

使用:

项目地址:https://github.com/Tamicer/RetrofitClient/commits/2.x

API姿势

Android基于Retrofit2.0+RxJava 封装的超好用的RetrofitClient工具类

GET

 RetrofitClient.getInstance(context)
                    .createBaseApi()
                    .get("url", maps)
                    .subscribe(new BaseSubscriber(context) {});

POST

 RetrofitClient.getInstance(MainActivity.this)
                    .createBaseApi()
                    .post("url", maps)
                    .subscribe( new BaseSubscriber(context) {});

JSON

   RequestBody jsonbody = 
               RequestBody.create(okhttp3.MediaType.parse("application/json; charset=utf-8"), new Gson().toJson(user));

   RetrofitClient.getInstance(MainActivity.this)
                  .createBaseApi()
                  .json("url", jsonBody)
                  .subscribe( new BaseSubscriber(context) {});

UpLoad

    RequestBody requestFile =
                    RequestBody.create(MediaType.parse("image/jpg"), new File(mPath));
        
    RetrofitClient.getInstance(MainActivity.this)
                   .createBaseApi()
                   .upload(url, requestFile)
                   .subscribe(new BaseSubscriber(context) {
                    });

Download

  RetrofitClient.getInstance(MainActivity.this)
  .createBaseApi()
  .download(url1, new CallBack() {

                      
            );

Execute you ApiService

定义MyApiService

public interface MyApiService {
  
    @GET("service/getIpInfo.php")
    Flowable> getData(@Query("ip") String ip);
}

Create ApiService

            //create  you APiService
            MyApiService service = RetrofitClient.getInstance().create(MyApiService.class);

Call

            // execute and add observable
            RetrofitClient.getInstance(MainActivity.this)
                    .switchSchedulersMain(service.getData("21.22.11.33"))
                    .subscribe(new BaseSubscriber>(MainActivity.this) {

                        });

More Rxjava

如果想操作RxJAVA更多操作符:


RetrofitClient.getInstance(Context)
                      .createBaseApi()
                      .get("service/getIpInfo.php", maps)
                      .compose(new FlowableTransformer() {
                          @Override
                          public Publisher apply(@NonNull Flowable upstream) {
                              return null;
                          }
                      })
                      .map(new Function() {
                          @Override
                          public Object apply(@NonNull Object o) throws Exception {
                              return null;
                          }
                      })
                      .xxxxx()//更多
                      .subscribe(new BaseSubscriber>() {

                          })
                                      

取消:

Flowable flowable =   RetrofitClient.getInstance()
                    .createBaseApi()
                    .get()
                   .ubscription()
                   .unsubscribe();

Rxjava结合Retrofit,如何优雅的取消请求!
优雅的取消请看:http://www.jianshu.com/p/d62962243c33

不华丽结束

看了这篇文有人会吐槽 这样的文章不是一发大把吗 大兄弟去年时候 这样的文章还真少 思路就是用我去年写的文章的思路 来升级上来的 不喜勿喷 同样的本次简单封装适合一些入门了Rxjava的朋友,上传进度啥可以去看我另一项目,这个版本设计也不未必是完美的,只是用来学习设计思想,喜欢的朋友可以直接源码自己增加想要的功能,如果想学习更多的姿势朋友推荐一款本人写的框架:Novate.

Novate
https://github.com/Tamicer/Novate

及时阅读文章可以关注我的号:


RxJava2和Retrofit封装的RetrofitClient2终于来了!_第2张图片
开发者技术前线

作者 Tamic
原文:http://www.jianshu.com/u/3bbb1ddf4fd5

你可能感兴趣的:(RxJava2和Retrofit封装的RetrofitClient2终于来了!)