为什么在项目中要慎用RxBus

RxBus在之前作为Android组件间通信工具,简单方便十分受欢迎。

  • 针对在事件的发送者和订阅者之间进行解耦
  • 非常好的运用在Activitys、Fragments和后台线程
  • 避开了联系紧密易出错的依赖关系和容易出错生命周期
  • 使你的代码更加简洁

##在Fragment之间传递数据

假设我们需要在AFragmentBFragment之间进行数据传递,如果不使用类似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相关推荐

  1. 面试题:JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录。作者——DengJun

    面试中遇到了这样的问题,JavaEE项目中,你准备如何解决高并发问题?比如1000万人同时登录. 1 .从最基础的地方做起,优化我们写的代码,减少必要的资源浪费.    a.避免频繁的使用new对象, ...

  2. Android设计模式之观察者模式在项目中的实际使用总结

    前言 观察者模式在Android开发中使用频率非常高,最常用的地方如订阅–发布系统,类似微信公众号用户订阅和接收消息的场景,因为这个模式最重要的功能就是解耦,将被观察者和观察者解耦,使得它们之间的依赖 ...

  3. canvas java 上传截图_在Vue项目中使用html2canvas生成页面截图并上传

    使用方法 项目中引入 npm install html2canvas html代码 //html代码 js代码 // 引入html2canvas import html2canvas from 'ht ...

  4. android studio 自动提示jni代码,如何将JNI(C/C++本机代码)添加到现有的Android Studio项目中...

    从现有项目中执行以下步骤: 1.修改build.gradle(模块应用程序)看起来像这样(很多变化!): apply plugin: 'com.android.model.application' m ...

  5. android使用webview上传文件,Android项目中如何在webview页面中上传文件

    Android项目中如何在webview页面中上传文件 发布时间:2020-11-26 15:56:27 来源:亿速云 阅读:68 作者:Leah 本篇文章为大家展示了Android项目中如何在web ...

  6. java fragment_Java Web Fragment在项目中使用方法详解

    Web Fragment 是什么 - 它是在 servlet 3.0开始支持的,可以把一个dy web项目拆分为多个项目,解耦合,使其在项目中开发效率提高,下面我演示简单的项目创建过程 用eclips ...

  7. JAVA Web项目中所出现错误及解决方式合集(不断更新中)

    JAVA Web项目中所出现错误及解决方式合集 前言 一.几个或许会用到的软件下载官网 二.Eclipse的[preferences]下没有[sever]选项 三.Tomcat的安装路径找不到 四.T ...

  8. Android Studio 在项目中引用第三方jar包

    在Android Studio项目中引用第三方jar包的方法: 步骤: 1.在build.gradle文件中添加如下代码: 备注:要添加在Android作用域下 sourceSets {main {j ...

  9. Database项目中关于Procedure sp_refreshsqlmodule_internal的错误

    最近项目中发现一怪问题,使用DB项目发布数据库时,总提示 "(110,1): SQL72014: .Net SqlClient Data Provider: Msg 1222, Level ...

  10. 分享.NET开发中经常使用到的代码片段 完全从实际项目中提取出来,也可被反反复复的重复借用...

    几年前,一篇<ASP.NET开发人员经常使用的三十三种代码>非常流行,它总结了一些经常在ASP.NET开发中使用到的代码,直接可以拿来使用.今天重读这篇文章,有感而发,善于总结也是进步,于 ...

最新文章

  1. centos7 安装 Mysql 5.7.28,详细完整教程
  2. 高端唯有定制,把 sublime 打造成专属的 IDE
  3. android studio编译提示错误:android Error:(21, 19) 错误: 程序包R不存在
  4. Android开发之The application could not be installed: INSTALL_FAILED_VERSION_DOWNGRADE报错
  5. Android之状态栏通知Notification、NotificationManager详解
  6. cf1504. Travelling Salesman Problem
  7. 设计模式学习之单件模式singleton
  8. Linux 7 关闭、禁用防火墙服务
  9. OpenShift Security (8) - 安装并运行 DevSecOps 应用
  10. 微课|玩转Python轻松过二级(2.2.4节):位运算符与集合运算符
  11. Java字符串格式化记录
  12. 单片机C语言任何位置跳转到任何指定地址 -转
  13. cs231n课后作业(1)
  14. 基于vb的mysql管理系统代码_VB ACCESS高校财务管理系统[论文 源代码 可执行程序]...
  15. AudioTrack音频播放
  16. SpringMvc中的@RequestMapping value 6个基本用法
  17. PDF编辑方法,怎么给PDF添加页码
  18. 探寻机器人创客教育中的趣味
  19. 微信小程序使用三元运算符
  20. 特征重要性判断(一)----决策树

热门文章

  1. 关于自动拼接地图算法
  2. 淘宝、天猫按关键词搜索商品API接口返回数据展示
  3. xposed框架android4,Xposed框架app_Xposed模块_xposed框架安卓4.4.4版-多特软件站安卓网...
  4. python 广义线性模型_scikit-learn 1.1 广义线性模型(Generalized Linear Models)
  5. C语言排序(冒泡排序、选择排序、插入排序和快速排序)
  6. STM32工作笔记0100---认识设备的IMEI号和SN号的区别
  7. Java 文件上传同时携带参数
  8. 长尾关键词是什么意思?如何使用5118挖掘和下载长尾词?
  9. mysql5.7 64位下载_MySQL5.7下载-MySQL数据库5.7下载 v5.7.22.1官方版(32位/64位)--pc6下载站...
  10. Vue 最黑暗的一天