网络请求有个问题就是取消操作。 
在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. Orcle定时生成表数据作业

    --建表 create table table41( id ) not null, --主键 col1 ), col2 ), col3 ), col4 int, col5 timestamp, col ...

  2. pymongo collection.save 问题

    项目中有这样一个需求,把路由器信息存入mongo,DB的结构如下: { router_name: name, router_ip: ip, interfaces: [ {oid:1,name:if1} ...

  3. python uzip

    import zipfile import osdef un_zip(file_name): """unzip zip file""" zi ...

  4. Ajax使用JSON数据格式

    1: •JSON(JavaScriptObject  Notation)一种简单的数据格式,比xml更轻巧.JSON是JavaScript原生格式,这意味着在JavaScript中处理JSON数据不须 ...

  5. Objective-C语言的 if ( self = [super init] )

    我们先假设如今自己创建了个类.我们起名叫MyObject,继承于NSObject. 继承知道吧,就是你这个子类(MyObject)假设什么都不写的话,和父类(NSObject)就是一模一样的. OC里 ...

  6. 混合式框架-AgileLite

    Agile Lite是一个HTML5移动前端框架.支持jQuery和Zepto双引擎.而且提供与UI无关的独立框架,内置了Flat UI样式和Ratchet样式.同一时候也支持单页模式和多页模式开发. ...

  7. python3 使用http.server模块 搭建一个简易的http服务器

    from http.server import HTTPServer, BaseHTTPRequestHandler import json data = {'result': 'this is a ...

  8. ZOJ 3609 Modular Inverse(扩展欧几里德)

    题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=4712 The modular modular multiplicat ...

  9. session 生命周期

    以前看到书上session 的生命周期,知道session的生命周期是在第一次访(即打开浏览器输入地址成功访问)的时候被创建.同时HttpSessionListener接口的sessionCreate ...

  10. ARM+llinux系统移植3G拨号上网收发短信(一)【转】

    本文转载自:http://blog.csdn.net/hanmengaidudu/article/details/17099737 一.      PPP移植 各项工作具体说明 向Linux内核添加3 ...