Android Retrofit+Rxjava2问题小记
网络请求有个问题就是取消操作。
在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问题小记的更多相关文章
- android -------- Retrofit + RxJava2.0 + Kotlin + MVP 开发的 WanAndroid 项目
简介 wanandroid项目基于 Retrofit + RxJava2.0 + Kotlin + MVP 用到的依赖 implementation 'io.reactivex.rxjava2:rxj ...
- 带你封装自己的MVP+Retrofit+RxJava2框架(一)
前言 文本已经收录到我的Github个人博客,欢迎大佬们光临寒舍:我的GIthub博客 看完本篇文章的,可以看下带你封装自己的MVP+Retrofit+RxJava2框架(二),里面封装得到了改进 本 ...
- Android Retrofit 2.0 使用-补充篇
推荐阅读,猛戳: 1.Android MVP 实例 2.Android Retrofit 2.0使用 3.RxJava 4.RxBus 5.Android MVP+Retrofit+RxJava实践小 ...
- Android Retrofit 2.0文件上传
Android Retrofit 实现(图文上传)文字(参数)和多张图片一起上传 使用Retrofit进行文件上传,肯定离不开Part & PartMap. public interface ...
- [旧][Android] Retrofit 初步使用
备注 原发表于2016.04.13,资料已过时,仅作备份,谨慎参考 Retrofit 是什么? Retrofit is a type-safe HTTP client for Android and ...
- 开发Android系统内置应用小记
Android系统内置应用可以使用更多的API.更高的权限,与开发普通应用最大的差别在于编译,内置应用编译需要用到Android.mk文件.下面是我在开发过程中的一些小记. 1.在AndroidMai ...
- Android Retrofit实现原理分析
retrofit有几个关键的地方. 1.用户自定义的接口和接口方法.(由动态代理创建对象.) 2.converter转换器.(把response转换为一个具体的对象) 3.注解的使用. 让我们跟随Ap ...
- Android Retrofit 2.0使用
实例带你了解Retrofit 2.0的使用,分享目前开发Retrofit遇到的坑和心得. 添加依赖 app/build.gradle 1 compile 'com.squareup.retrofit2 ...
- 123、 android Retrofit 介绍和使用(转载)
简单使用:http://blog.csdn.net/bitian123/article/details/51899716 http://blog.csdn.net/duanyy1990/article ...
随机推荐
- Linux NFS服务器的安装与配置(转载)
一.NFS服务简介 NFS 是Network File System的缩写,即网络文件系统.一种使用于分散式文件系统的协定,由Sun公司开发,于1984年向外公布.功能是通过网络让不同的机器.不同的操 ...
- Linux系统调用过程分析
參考: <Linux内核设计与实现> 0 摘要 linux的系统调用过程: 层次例如以下: 用户程序------>C库(即API):INT 0x80 ----->system_ ...
- COCOS学习笔记--即时动作ActionInstant
Cocos引擎中的动作类的关系图例如以下: 能够看出,Action是继承自Ref类的,之前我的博客中也有讲过,Ref类是cocos2dx全部类的基类.动作类(Action)是全部动作的基类.它通过cr ...
- hdu, KMP algorithm, linear string search algorithm, a nice reference provided
reference: Rabin-Karp and Knuth-Morris-Pratt Algorithms By TheLlama– TopCoder Member https://www.top ...
- linux恢复误删除文件-extundelete
经过本人測试该工具支持ext3和ext4文件系统 当发现某个分区的数据被误删除后.要做的第一件事是立马卸载被误删除文件所在的分区,或者又一次以仅仅读方式挂载此分区. 这么做的原因事实上非常eas ...
- MySQL-修改数据(REPLACE)
MySQL-REPLACE语句 功能介绍:用于向数据库表插入或更新数据. REPLACE语句的工作原理: 如果给定行数据不存在,那么MySQL REPLACE语句会插入新行. 如果给定行数据存在,则R ...
- Iteye已经沦陷
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvZHl5YXJpZXM=/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA ...
- 记一次ORA-600[13011]
SunOS 5.10 Oracle 10.2.0.2.0 开发环境某一数据库出现ora-600报错. alert.log中的报错信息: Thu Nov 13 15:11:43 2014 Errors ...
- FastDFS的实现
FastDFS的实现 环境 centos7.1节点提供tracker和storage服务 centos7.2,centos7.3只提供storage服务 FastDFS的实现 fastdfs-5.0. ...
- Python基础 — OS
OS模块 -- 简介 OS模块是Python标准库中的一个用于访问操作系统功能的模块,OS模块提供了一种可移植的方法使用操作系统的功能.使用OS模块中提供的接口,可以实现跨平台访问.但是在OS模块 ...