网络请求有个问题就是取消操作。 
在Rxjava1中,调用subscribe之后会返回Subscription,然后利用CompositeSubscription进行统一管理。 
在Rxjava2中,调用subscribe之后,返回的则是Disposable,Disposable同样用CompositeDisposable进行统一管理。 
在Rxjava1中,我们继承Subscriber,可以这么写。

class MySubscriber<T> extends Subscriber<T> {

    @Override
public void onStart() {
//do sth
} @Override
public void onCompleted() {
//do sth
} @Override
public void onError(Throwable e) {
//do sth
} @Override
public void onNext(T response) {
//do sth
}
}

而在Rxjava2中,我们则要继承ResourceSubscriber,写法也有些修改

class MySubscriber<T> extends ResourceSubscriber<T> {

    @Override
public void onStart() {
super.onStart();//这里要特别注意,不能忽略,我就因为没注意到这个,吃了不少的亏
} @Override
public void onComplete() {
} @Override
public void onError(Throwable e) {
} @Override
public void onNext(T response) {
}
}

然后要注意的就是FlowableOnSubscribe这个类,一般来说我们会这么写:

Flowable.create(new FlowableOnSubscribe<T>() {
@Override
public void subscribe(final FlowableEmitter<T> e) throws Exception {
try {
Response<T> response = call.execute();
e.onNext(response.body());
e.onComplete();
} catch (Exception exception) {
e.onError(exception);
e.onComplete();
}
}
}, BackpressureStrategy.BUFFER);

但这样子就会有个错误,上面提到了CompositeDisposable这个要管理Disposable,如果我们取消了操作,那就极有可能会发生,InterruptedException异常,因为call还在继续执行,它执行完之后,就会调用 e.onNext(response.body());之类的方法,继而抛出异常,解决方案就是把上面的改写一下:

Flowable.create(new FlowableOnSubscribe<T>() {
@Override
public void subscribe(final FlowableEmitter<T> e) throws Exception {
//设置取消监听
e.setCancellable(new Cancellable() {
@Override
public void cancel() throws Exception {
if (!call.isCanceled()) {
call.cancel();
}
}
});
try {
Response<T> response = call.execute();
if (!e.isCancelled()) {
e.onNext(response.body());
e.onComplete();
}
} catch (Exception exception) {
if (!e.isCancelled()) {
e.onError(exception);
e.onComplete();
}
}
}
}, BackpressureStrategy.BUFFER);

加入了取消监听以及取消判断就ok了,这样子的做法比Rxjava1要好,Rxjava1即使取消了订阅,请求却还会继续跑,这就不会了

Android Retrofit+Rxjava2问题小记的更多相关文章

  1. android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目

    简介 wanandroid项目基于 Retrofit + RxJava2.0 + Kotlin + MVP 用到的依赖 implementation 'io.reactivex.rxjava2:rxj ...

  2. 带你封装自己的MVP+Retrofit+RxJava2框架(一)

    前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...

  3. Android Retrofit 2.0 使用-补充篇

    推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...

  4. Android Retrofit 2.0文件上传

    Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...

  5. [旧][Android] Retrofit 初步使用

    备注 原发表于2016.04.13,资料已过时,仅作备份,谨慎参考 Retrofit 是什么? Retrofit is a type-safe HTTP client for Android and ...

  6. 开发Android系统内置应用小记

    Android系统内置应用可以使用更多的API.更高的权限,与开发普通应用最大的差别在于编译,内置应用编译需要用到Android.mk文件.下面是我在开发过程中的一些小记. 1.在AndroidMai ...

  7. Android Retrofit实现原理分析

    retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...

  8. Android Retrofit 2.0使用

    实例带你了解Retrofit 2.0的使用,分享目前开发Retrofit遇到的坑和心得. 添加依赖 app/build.gradle 1 compile 'com.squareup.retrofit2 ...

  9. 123、 android Retrofit 介绍和使用(转载)

    简单使用:http://blog.csdn.net/bitian123/article/details/51899716 http://blog.csdn.net/duanyy1990/article ...

随机推荐

  1. Property 'sqlMapClient' is required

    继承SqlMapClientDaoSupport类的类里面添加如下代码 @Resource(name = "sqlMapClient") private SqlMapClient ...

  2. MongoDB小结16 - find【查询条件$in】

    $in可以查询一个键的多个值 举例,每个人有爱好,假定为一个,数据太多,咱们用第二个参数来过滤一下 db.user.find({},{"_id":0}) { "hobby ...

  3. 背包系统学习笔(tu)记(cao)

    这几天在学习背包系统,网上有看到一个挺牛逼的背包系统,不过人家那个功能很全面,一个背包系统就囊括了装备,锻造,购买等等功能(这里给出网址:https://blog.csdn.net/say__yes/ ...

  4. VS2012 ASP.NET 母版页的创建与使用

    在做牛腩新闻公布系统的过程中,须要使用ASP.NET的母版页来抽出全部网页的公共部分,以便更好的复用自己的网页布局和设计. 首先我们来看怎样创建一个新的母版页,例如以下图所看到的: 加入之后,例如以下 ...

  5. 网页设计中11 款最好CSS框架

    网页设计和发展领域已经成为竞争激烈的虚拟世界.想要在网络的虚拟世界中生存,仅有一堆静止的在线网络应用是远远不够的,网页必须要有很多功能,配以让人无法抗拒的设计.网页编码一定要合适.精确,才能保证不发生 ...

  6. Linux/Android——Input系统之frameworks层InputManagerService (六)【转】

    本文转载自:http://blog.csdn.net/u013491946/article/details/72638954 版权声明:免责声明: 本人在此发文(包括但不限于汉字.拼音.拉丁字母)均为 ...

  7. URAL 1057 数位dp

    题目传送门http://acm.timus.ru/problem.aspx?space=1&num=1057 最近在学习数位dp,具体姿势可以参照这篇论文:http://wenku.baidu ...

  8. SGU 145

    节点不可重复经过的K短路问题. 思路:二分路径长度,深搜小于等于路径长度的路径数.可以利用可重复点K短路问题中的A*函数进行剪枝. 尝试另一种解法:把可重复点K短路A*直接搬过来,堆中的每个元素额外记 ...

  9. mysql与mongoDB的特点和优劣

    首先分析下mysql与mongoDB的特点和优劣 从图中分析: 再来分析下应用场景: a.如果需要将mongodb作为后端db来代替mysql使用,即这里mysql与mongodb 属于平行级别,那么 ...

  10. iphone分辨率大全

    分辨率越高,屏幕质量也就越高越清晰,iphone的近几代产品处了从3GS到4代时有一个突破性的变化(当然那个时候3GS像素确实太低了),其他的几代产品在这项指标上并未有太大的变化. iphone分辨率 ...