博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
如何优雅地取消Retrofit请求?
阅读量:6814 次
发布时间:2019-06-26

本文共 2052 字,大约阅读时间需要 6 分钟。

在实际开发中,页面关闭,取消请求是很常见的需求,这里分享一种简单的实现方法。 我的思路是把网络请求和上下文的生命周期绑定。这里用用到了Rxjava的Subject,Subject 既是 Observable 又是 Observer(Subscriber)。既可以发消息也可以接收消息。

我首先定义了几个枚举,对应上下文的生命周期。

public enum ActivityLifeCycleEvent {    CREATE,START,RESUME,PAUSE,STOP,DESTROY}复制代码

Fragment为例,在BaseFragment中,相应的生命周期回调中发射消息。

import rx.subjects.PublishSubject;public abstract class BaseFragment extends Fragment {    protected final PublishSubject
lifecycleSubject = PublishSubject.create(); @Override public void onActivityCreated(@Nullable Bundle savedInstanceState) { // TODO Auto-generated method stub super.onActivityCreated(savedInstanceState); } @Override public void onPause() { super.onPause(); lifecycleSubject.onNext(ActivityLifeCycleEvent.PAUSE); } @Override public void onStop() { super.onStop(); lifecycleSubject.onNext(ActivityLifeCycleEvent.STOP); } @Override public void onResume() { super.onResume(); lifecycleSubject.onNext(ActivityLifeCycleEvent.RESUME); } @Override public void onDestroy() { super.onDestroy(); lifecycleSubject.onNext(ActivityLifeCycleEvent.DESTROY); }}复制代码

一般情况下我们会使用Retrofit+Rxjava来进行网络请求,比如像下面这样:

@Multipart@POST(Urls.TIMER_GETUSERDETAIL_RX)Observable
> getUser(@PartMap Map
map);复制代码

具体请求的时候可能是下面这样

ApiService.instancce()  .getUser(p.build())  .takeUntil(bindLifeCycle(lifecycleSubject,ActivityLifeCycleEvent.DESTROY))  .subscribe({      ……  })复制代码

注意:下面这句话

.takeUntil(RxUtils.bindLifeCycle(lifecycleSubject, ActivityLifeCycleEvent.DESTROY))复制代码

takeUntil一旦响应是成功它将自动终止源Observable于是停止向后端发送数据。如果不是则继续发送请求。这里如果收到ActivityLifeCycleEvent.DESTROY消息,就会停止向后端发送数据。

public static Observable
bindLifeCycle(PublishSubject
lifecycleSubject, ActivityLifeCycleEvent bindEvent) { return lifecycleSubject.takeFirst(activityLifeCycleEvent -> activityLifeCycleEvent.equals(bindEvent)); }复制代码

嗯,就这么多。下面就是愉快地使用吧~

本方法只是取消了接受网络数据之后的后续操作,并不是真正停止了当前的请求哦~

转载地址:http://utzzl.baihongyu.com/

你可能感兴趣的文章
Mysql 用中间件atlas进行读写分离(学习笔记十四)
查看>>
想要保护自主品牌知识产权需要了解商标注册的一些技巧
查看>>
获取图片的长和宽
查看>>
Java基础算法详解
查看>>
OpenCV3 自动白平衡:灰度世界和完美反射算法
查看>>
Gradle特殊用法
查看>>
[雪峰磁针石博客]2018最佳人工智能数据采集(爬虫)工具书下载
查看>>
手把手学IOT服务端API编程[3、查询产品]|MVP讲堂
查看>>
Java 8新特性
查看>>
查找依赖库的最新版本
查看>>
PopupWindow 使用详解(一) 中文API 文档 赠送 ListPopupWindow 中文 API
查看>>
【JavaScript】通过封装自己的JSONP解决浏览器的跨域问题(Ajax跨域)
查看>>
企业公有云服务的构建“捷径”,看这一篇文章就够了
查看>>
专注“智造”,李群自动化获亿元级C轮融资
查看>>
[剑指offer] 和为S的两个数字
查看>>
EntityFramework实现增删改查
查看>>
Android 自用 App保活——音乐播放保活适配8.0 (贼好用)
查看>>
Gradle基础语法Groovy
查看>>
如何快速学习数据挖掘,机器学习,人工智能?
查看>>
程序媛成长纪:从DBA到研发工程师
查看>>