为什么在项目中要慎用RxBus
为什么在项目中要慎用RxBus
RxBus在之前作为Android组件间通信工具,简单方便十分受欢迎。
- 针对在事件的发送者和订阅者之间进行解耦
- 非常好的运用在Activitys、Fragments和后台线程
- 避开了联系紧密易出错的依赖关系和容易出错生命周期
- 使你的代码更加简洁
##在Fragment之间传递数据
假设我们需要在AFragment
和BFragment
之间进行数据传递,如果不使用类似RxBus
这样的通信工具,我们需要使用__广播__或者__接口回调__等方式传递数据,这样极其繁琐且无法在其他地方需要使用时直接复用。
这里我们举例,将AFragment
中的一个EditText
的文本数据在有变化时,实时传递给BFragment
。
- 在
AFragment
监听数据并发送变化后的数据
public class AFragment extends BaseFragment {@SuppressLint("CheckResult")@Nullable@Overrideprotected void onCreateView(View view) {super.onCreateView(view);//监听AFragment的et数据变化RxTextView.afterTextChangeEvents(et).subscribe(event -> {// RxBus.send(new TradeEvent.TextChange(event.toString()));//使用RxBus发送数据,这里直接发送sticky事件,以模拟AFragment事件发生时,BFragment还未创建的情况RxBus.send(true, new TradeEvent.TextChange(event.toString()));});}@Overrideprotected int initLayout() {return R.layout.fragment_a;}@Overrideprotected void subscribe() {}
}
- 在
BFragment
监听变化后的数据
public class BFragment extends BaseFragment {@SuppressLint("CheckResult")@Overrideprotected void subscribe() {RxBus.observable(TradeEvent.TextChange.class).subscribe(e -> {//获取变化后的数据LogHelper.d(e.s);});}@Overrideprotected int initLayout() {return R.layout.fragment_a;}}
这个例子中,我们只需要简单的在需要发送数据的地方实现RxBus.send()
,在需要接受数据的地方实现RxBus.observable()
即可完成整个逻辑。但是这样并不代表,我们可以在任何情况下都如此去传递数据。
在网络请求时传递数据
例如我们需要在跳转一个页面之前,请求这个页面的数据,并在页面创建之后使用这个数据展示页面,我们会这么写:
- 封装好的网络请求
/*** 订单详情 调用后监听 OrderEvent.DetailChange** @param orderId 订单Id*/public void orderDetail(String orderId) {//防止之前的sticky事件还未被消费RxBus.removeSticky(OrderEvent.DetailChange.class);OrderDetailRequest json = new OrderDetailRequest(orderId);RequestEntity entity = new RequestEntity(IdlefishCloudApi.IDLEFISH_URL, json, json._head._interface + orderId, CacheMode.REQUEST_FAILED_READ_CACHE);HttpHelper.http_post(entity, new IdlefishCallback<IdlefishResponse<OrderDetailResponse>, OrderDetailRequest>(true, json) {@Overrideprotected void onSuccess(HttpRequest<OrderDetailRequest> httpRequest, boolean isCache, IdlefishResponse<OrderDetailResponse> body, int code) {super.onSuccess(httpRequest, isCache, body, code);if (body == null || body._data == null || body._data.data == null) return;RxBus.send(true, new OrderEvent.DetailChange(body._data.data));}});}
- 页面中接受网络请求
// 接收订单详情
RxBus.observable(OrderEvent.DetailChange.class, this).subscribe(detailChange -> {//do something});
这样一看,即保证了网络数据的封装,又保证了页面UI和数据的分割,很完美。
其实并不然,这样有一个极大的隐患。由于数据的获取是网络请求,如果在RxBus.send()
触发前,页面已经关闭,那么下次用户进来时,此页面就会获取到上次请求的数据。
RxBus
慎用点
现在我们来总结一些,慎用RxBus
的情况:
- 尽量不要使用sticky事件
- 不要在耗时事件中,使用sticky事件
- 非组件间通信,尽量不要使用其传递数据
- 每个独立的事件,尽量使用不同的Event,防止互相干扰
参考文章:
- https://www.jianshu.com/p/61631134498e
- https://blog.csdn.net/shanshan_1117/article/details/82691218
为什么在项目中要慎用RxBus相关推荐
- 面试题:JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录。作者——DengJun
面试中遇到了这样的问题,JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录. 1 .从最基础的地方做起,优化我们写的代码,减少必要的资源浪费. a.避免频繁的使用new对象, ...
- Android设计模式之观察者模式在项目中的实际使用总结
前言 观察者模式在Android开发中使用频率非常高,最常用的地方如订阅–发布系统,类似微信公众号用户订阅和接收消息的场景,因为这个模式最重要的功能就是解耦,将被观察者和观察者解耦,使得它们之间的依赖 ...
- canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传
使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...
- android studio 自动提示jni代码,如何将JNI(C/C++本机代码)添加到现有的Android Studio项目中...
从现有项目中执行以下步骤: 1.修改build.gradle(模块应用程序)看起来像这样(很多变化!): apply plugin: 'com.android.model.application' m ...
- android使用webview上传文件,Android项目中如何在webview页面中上传文件
Android项目中如何在webview页面中上传文件 发布时间:2020-11-26 15:56:27 来源:亿速云 阅读:68 作者:Leah 本篇文章为大家展示了Android项目中如何在web ...
- java fragment_Java Web Fragment在项目中使用方法详解
Web Fragment 是什么 - 它是在 servlet 3.0开始支持的,可以把一个dy web项目拆分为多个项目,解耦合,使其在项目中开发效率提高,下面我演示简单的项目创建过程 用eclips ...
- JAVA Web项目中所出现错误及解决方式合集(不断更新中)
JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...
- Android Studio 在项目中引用第三方jar包
在Android Studio项目中引用第三方jar包的方法: 步骤: 1.在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets {main {j ...
- Database项目中关于Procedure sp_refreshsqlmodule_internal的错误
最近项目中发现一怪问题,使用DB项目发布数据库时,总提示 "(110,1): SQL72014: .Net SqlClient Data Provider: Msg 1222, Level ...
- 分享.NET开发中经常使用到的代码片段 完全从实际项目中提取出来,也可被反反复复的重复借用...
几年前,一篇<ASP.NET开发人员经常使用的三十三种代码>非常流行,它总结了一些经常在ASP.NET开发中使用到的代码,直接可以拿来使用.今天重读这篇文章,有感而发,善于总结也是进步,于 ...
最新文章
- centos7 安装 Mysql 5.7.28,详细完整教程
- 高端唯有定制,把 sublime 打造成专属的 IDE
- android studio编译提示错误:android Error:(21, 19) 错误: 程序包R不存在
- Android开发之The application could not be installed: INSTALL_FAILED_VERSION_DOWNGRADE报错
- Android之状态栏通知Notification、NotificationManager详解
- cf1504. Travelling Salesman Problem
- 设计模式学习之单件模式singleton
- Linux 7 关闭、禁用防火墙服务
- OpenShift Security (8) - 安装并运行 DevSecOps 应用
- 微课|玩转Python轻松过二级(2.2.4节):位运算符与集合运算符
- Java字符串格式化记录
- 单片机C语言任何位置跳转到任何指定地址 -转
- cs231n课后作业(1)
- 基于vb的mysql管理系统代码_VB ACCESS高校财务管理系统[论文 源代码 可执行程序]...
- AudioTrack音频播放
- SpringMvc中的@RequestMapping value 6个基本用法
- PDF编辑方法,怎么给PDF添加页码
- 探寻机器人创客教育中的趣味
- 微信小程序使用三元运算符
- 特征重要性判断(一)----决策树
热门文章
- 关于自动拼接地图算法
- 淘宝、天猫按关键词搜索商品API接口返回数据展示
- xposed框架android4,Xposed框架app_Xposed模块_xposed框架安卓4.4.4版-多特软件站安卓网...
- python 广义线性模型_scikit-learn 1.1 广义线性模型(Generalized Linear Models)
- C语言排序(冒泡排序、选择排序、插入排序和快速排序)
- STM32工作笔记0100---认识设备的IMEI号和SN号的区别
- Java 文件上传同时携带参数
- 长尾关键词是什么意思?如何使用5118挖掘和下载长尾词?
- mysql5.7 64位下载_MySQL5.7下载-MySQL数据库5.7下载 v5.7.22.1官方版(32位/64位)--pc6下载站...
- Vue 最黑暗的一天