本文出处 :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处理起来比较麻烦,因此