Rxjava +Retrofit 你需要掌握的几个技巧,Retrofit缓存,RxJava封装,统一对有无网络处理,异常处理, 返回结果问题

本文详细介绍了如何在使用Retrofit2.0和RxJava时,处理网络请求的缓存、错误处理、视图消亡后的取消订阅、动态接口创建以及统一的Subscriber管理。通过自定义错误处理类和拦截器,实现了对错误状态的转换和缓存策略。同时,提供了一种通用接口定义方式,减少了接口代码的编写。

本文出处 :Tamic 个人公众号:开发者技术前线
文/ http://blog.csdn.net/sk719887916/article/details/52132106

Rxjava +Rterofit 需要掌握的几个技巧

这里写图片描述

RXjava入门和详解请移步 比较有名的《RxJAVA详解》,这里继续前篇一些列的介绍一些容易忽略的技巧.

Retrofit+RxJava结合系列请阅读:


#取消订阅
一般我们在视图消亡后,无需RxJava再执行,可以直接取消订阅

  if (!subscription.isUnsubscribed()) {
        subscription.unsubscribe();
    }
    
 observable.unsubscribeOn(Schedulers.io());

可用在activity的 onDestroy(), Fragment的 onDestroyView()中调用

还有种场景是借助rxJava请求网络数据,需要网络返回后保存数据并更新UI,这种情况视图已经消亡了必定会导致rxJava出错,导致App闪退,这种我们可以判断前的activity/view是否为空,并是否已showing,如果
两者都不存在,即可无须更新UI。只处理保存数据即可。

#订阅问题

需要UI绘制后再进行订阅的场景,防止阻塞UI,我们需要延迟订阅执行。

立即订阅;

observable
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(action);

延迟订阅

observable.delay(2, TimeUnit.SECONDS)
               .subscribeOn(Schedulers.io())
               .observeOn(AndroidSchedulers.mainThread())
               .subscribe(action);

基础ApiService

通常我们写接口会有以下定义,增加一个api就必须写一个方法

public interface MyApi {

@GET("app.php")
Observable<SouguBean> getSougu(@Query("name") String name);

@GET("/getWeather")
Observable<ResponseBody> getWeather(@QueryMap Map<String, String> maps);
}

很多时候每新增一个接口就要写一个api,是不是有很好的方法代替这种情况。

@GET()
<T> Observable<ResponseBody> get(
        @Url String url,
        @QueryMap Map<String, T> maps);

我们可以定义一个通用的getApi,将url动态传入,返回Modle定义为ResponseBody, 并将实际参数定义为泛型,不管是更改url,还是服务端返回类型,包括参数个数都可以完美适配,这种方式技术不到位的千万别用,因为Retrofit明确说明接口必须要给定明确类型,悠着点哈!

上层进行通用组装时就可以这样子:

   public <T> T get(String url, Map<String, T> maps, BaseSubscriber<ResponseBody> subscriber) {
return (T) apiManager.get(url, maps)
.compose(schedulersTransformer)
.compose(handleErrTransformer())
.subscribe(subscriber);
}

看不懂?看不懂不算奇怪,源码可以去文章末尾下载研究,这里只是列举了一下。这种方式很适合从HttpClent迁移到Retrofit带来接口适配问题,一用一个准啊…

#基础Subscriber

很多时候我们需要借用RxJava开启多个observable去读取网络,这是我们对不同Subscriber处理起来比较麻烦,因此

评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值