【腾讯Bugly干货分享】基于RxJava的一种MVP实现

AWS RDS 介绍 三)创建 RDS 实例 AWS RDS 介绍 共分为 7 个部分, 其中 第 3部分重点介绍,如何创建一个RDS 实例。 三) AWS RDS 试用MySQL http://docs.aws.amazon.com/AmazonRDS/latest/UserGuide/CHAP_GettingStarted.CreatingConnecting.MySQL. 阅读详情

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57bfef673c1174283d60bac0

Dev Club 是一个交流移动开发技术,结交朋友,扩展人脉的社群,成员都是经过审核的移动开发工程师。每周都会举行嘉宾分享,话题讨论等活动。

本期,我们邀请了腾讯IEG Android 开发工程师——戴俊,为大家分享《基于RxJava的一种MVP实现》。

分享内容简介:

RxJava是一个实现Java响应式编程的库,让异步事件以序列的形式组织。MVP则通常用来将View业务层与Model层分离开来,两者结合起来可轻松实现业务解耦、线程控制、单元测试等等强大功能

内容大体框架:

  1. Android开发框架的选择
  2. 如何一步步搭建MVP分层框架
  3. 使用RxJava来进行线程控制
  4. 结语

下面是本期分享内容整理


Hello,大家好,我是戴俊。目前在IEG腾讯动漫主要负责Android端的开发工作。

第一次进行这种微信群的分享,如果有任何疑问,欢迎大家在分享结束后提问。下面开始我们今天的分享。

1. Android开发框架的选择

我们知道原生Android开发已经是一个基础的MVC框架,所以在项目刚开始开发的时候并没有遇到太多问题。

对一个经典的Android MVC框架来讲,它的结构大概是下面这样(图片来自参考文献)

这样的结构下,Activity层既承担了View层的一部分工作(因为XML作为View层的一部分功能实在太弱了),又承担Controller层的工作,因此当业务变化时,Activity层会极剧膨胀。

拿我们项目早期的例子,一个Activity曾经最多达到了2000到3000行,重构的时候极其痛苦。

要解决这个问题,主要的办法有两种:
- 第一种是分层
- 第二种是模块化。

两个方法最终要实现的都是解耦。分层讲的是纵向层面上的解耦,模块化则是横向上的解耦。

我们今天要讨论的MVP就是一种通过分层来进行解耦的框架。

2. 如何一步步搭建MVP分层框架

如果你是个习惯了读文档的老司机,可以直接参考下面几篇文章

  1. Android Application Architecture
  2. Android Architecture Blueprints - Github
  3. Google官方MVP示例之TODO-MVP - 简书
  4. todo-mvp - github
  5. dev-todo-mvp-rxjava - github

当然如果觉得看官方的示例太麻烦,那么下面我们就来讲解一下如何实现一个简单的MVP构架。

这是一个比较典型的MVP结构图(图片来自参考文献),相比于第一张图,多了两个层,一个是Presenter和DataManager层。

多出这两个层到底有什么作用,下面我们来用代码说明。

首先我们假设有一个从服务端获取字符串并显示的手机上的简单功能。下面是主界面的代码

Activity里面包含了几个文件,一个是View层的对外接口MainView,一个是P层的Presenter。

首先看View层的对外接口文件

因为这个功能比较简单,只需要在设备上显示一个字符串,所以只有一个接口方法onShowString(),再看P层代码

从上面三个文件可以看到,View层通过注册Listener将自己的接口MainView交给了Presenter, 而Presenter层持有Model层的也只是一个接口。通过Presenter层将业务层与展现层隔离了开来,这样的好处是什么?

我们知道接口的一个作用通常是用来抽象行为,对外部屏蔽实现细节。所以对于View层来说,业务细节被屏蔽了,对业务层来说,展示细节被屏蔽了。而对于处于中间的Presenter层来说,它就像一个接口拼装器,把View层发出的请求传递给业务层,把业务层返回的数据又送还给View层展示,至于前后两端怎么实现的,它才不用关心。

接口的第二个作用是可以用来切换实现。我们先看下面的代码。

从上面三个文件可以看到,业务层对外的只有一个接口,实现却有两个(DataSourceImpl和DataSourceTestImpl)。从名字大家就能看出来有什么作用了,一个是正常环境的业务层实现,一个是测试环境的业务层实现。

这里我们设想一个场景:

开发同学接到一个新的需求,设计稿也输出完成了,然而后台的接口却迟迟没到,怎么办? 现在通过MVP,我们把业务层实现切换到DataSourceTestImpl,是不是可以先自己假写数据,调好一切前端和交互,然后泡一杯咖啡等后台同学把接口写完联调?或者有时候为了重现一个bug,要在线上写一条脏数据,测试完再删除?

类似的应用场景其实有非常非常多,这里我们就看到了使用接口解耦的一个好处了,不仅把业务层和展示层解耦开来,还把Android开发同其它的一切的外部数据依赖都解耦开来。

这里我想提到之前讨论过的单元测试问题,很多同学反馈项目开发过程中没有做过,或者没有时间精力去做单元测试,或者因为业务变化太大导致无法做单元测试。其实在我们项目中也遇到过样的问题,但其实通过这样分层之后,才发现单元测试其实是完全可以推进的,也完全不用再担心测试的时候会把脏数据写到线上的问题了。

到现在为止一个基于MVP简单框架就搭建完成了,但其实还遗留了一个比较大的问题。

很多同学可能已经发现了,Presenter层在调用业务层的时候是直接调用的,而Android规定,主线程是无法直接进行网络请求,会抛出NetworkOnMainThreadException异常。

所以在presenter层,我们需要进行一项线程切换的工作,这样才能保证“所有的IO操作都应当在线程中完成,主线程只负责页面渲染的工作”这一优化准则。

当然,Android本身提供一些方案,比如下面这种:

通过新建子线程进行IO读写获取数据,然后通过主线程的Looper将结果通过传回主线程进行展示,这种方案是勉强也行得通的。

但问题也有,一是线程需要额外管理,不可能每次发请求都要开启一个线程;二是适应性差,假如数据请求有先后依赖,有并行的情况,这样的写法变得脏乱无比。

好在有了RxJava ,可以比较方便的解决这个问题。

3. 使用RxJava来进行线程控制

RxJava是一个天生用来做异步的工具,相比AsyncTask,Handler等,它的优点就是简洁,无比的简洁。在Android中使用RxJava需要加入下面两个依赖。

compile 'io.reactivex:rxjava:1.0.14' 
compile 'io.reactivex:rxandroid:1.0.1'

这里我们直接介绍如何使用RxJava解决这个问题,在presenter中修改方法getData()。

简单解释一下,dataAction是我们的数据业务逻辑,viewAction是界面的显示逻辑,通过RxJava的传递和变换,dataAction会在由RxJava管理的IO线程–Schedulers.io() 中执行,而viewAction则会在UI线程–AndroidSchedulers.mainThread()中执行。

RxJava当然不止这么简单,还有别的玩法,比方说进入一个界面的时候,需要先加载缓存的数据,然后再从网络获取更新的数据进行刷新。有的时候,可能还需要处理IO过程中的异常情况,加入RxJava的异常处理参数。

RxJava的使用场景远不止这些,线程变换、数据变换、接口顺序依赖、接口并发请求这些要求对它来说都是小菜一碟。当然,有些同学可能觉得RxJava入手有些困难,代码也会变得不那么直观,但相信只要大家慢慢熟悉它之后,它就会变得无比讨人喜欢。

下面列出了一些常见的RxJava的常用场景,其实还有更多的其它功能等待着大家去挖掘。

  1. 取数据先检查缓存的场景
  2. 需要等到多个接口并发取完数据,再更新
  3. 一个接口的请求依赖另一个API请求返回的数据
  4. 界面按钮需要防止连续点击的情况
  5. 响应式的界面
  6. 复杂的数据变换

上面这些功能都可以通过RxJava来轻松完成。具体的使用就不再多讲了,大家可以参考下面的文章:(Google文章名就可以了)

1.给 Android 开发者的 RxJava 详解
2.RxJava 与 Retrofit 结合的最佳实践
3.RxJava使用场景小结
4.How To Use RxJava

结语

至此为止,通过MVP+RxJava的组合,我们已经构建出一个比MVC更灵活的Android项目开发框架,好处大概有以下几点:

  1. 每层各自独立,通过接口通信
  2. 实现与接口分离实现,不同场景(正式,测试)挂载不同的实现,方便测试写假数据
  3. 所有的业务逻辑都在非UI线程中进行,最大限度减少IO操作对UI的影响
  4. 使用RxJava可以将复杂的调用进行链式组合,解决多重回调嵌套问题

以上就是我今天的分享,内容上可能还有不足甚至不够好的地方,欢迎大家指出,一起讨论学习。

这里也顺便打个广告,欢迎大家下载腾讯动漫App,这里有最新最热的国漫日漫,支持正版,你我共享。

问答环节

Q1:对于这样的一个MVP项目,它里面的包结构怎样规划比较清晰合理呢?

包结构的通常分法有两种:一种是按功能模块分,把某一个功能的presenter, activity,view层接口放到一起;一种是按类型分,P层M层和V层分成三个包。实际项目应用,我个人倾向于第一种,这种无论是开发过程,还是排查问题都会方便很多。当然,不同的项目还是有不同的分法的,不一而论。

Q2:耗时操作可能引起的内存泄露问题,请问是如何处理的。
Q3:用mvp时,请问你们在哪里释放一些引用,防止内存泄露的
Q4:p持有v的引用,请问怎么解决Activity的内存泄露问题?
Q5:网特别慢的时候,应用退出,但网络请求还没结束,p层回调持有上下文造成内存泄露,一般怎么解决啊。

这几个问题其实比较类似,我们在实际项目中,presenter会随着activity的生命周期进行销毁,比如在onDestroy方法中对presenter进行置空和引用解绑, 当然我们可以给所有的Presenter写一个共有父类BasePresenter,专门来处理这个问题。

Q6:需求包含列表页的时候,列表项也是按照mvp的思想来分层,还是封装成模块比较合适

目前我们的做法是直接封装成模块,简单的问题不宜过度设计

Q7:想问一下腾讯动漫这个app目前用的就是您讲的这个架构吗,在实际用的过程中有遇到什么问题吗

是的,我们已经使用了这个架构。实际使用过程中,经常会纠结的问题是业务逻辑层要不要再次独立分层。

Q8:项目中做测试是好事,但我觉得建议去掉TestImpl测试文件。如果项目打包时,打到包里,会导致包变大,这种测试建议用node写个简单的服务,不知道嘉宾你咋看?

是的。正式项目中,可以通过注解,或者proguard或者gradle的配置将这些测试文件不打到包里。Node写服务的话是不是又要搭环境,这里的做法就是不使用任何外部环境依赖。

Q9:mvp一般都是activity和Fragment加入presenter层,那么列表adapter里的逻辑是否也要加上presenter层呢

Adapter其实跟View更接近的一个东西,它是用来处理重复显示问题。一般来说,我们传给adapter的数据完好能直接显示的,建议在业务逻辑层将数据拼装好再传进去。
答:Adapter其实跟View更接近的一个东西,它是用来处理重复显示问题。一般来说,我们传给adapter的数据完好能直接显示的,建议在业务逻辑层将数据拼装好再传进去。

Q10:我们项目中采用了MVP但是没有用RxJava,m与p层采用回调方式,这样m通过回调间接引用p,p层有v的引用。如果在网络情况不好频繁打开关闭页面在网络请求结束前是否会有内存泄漏问题。rx是否能解决这个问题。还有当网络结束回调时v对应activity destory了怎么办。每次都去判断activity状态吗?

Rx不能解决内存泄漏的问题,前面2.3.7问题都提到了,通常的做法是在activity层销毁的时候进行解绑。回调时activity destory的话,我们现在的做法是对view层接口进行一次空值判定。如果有更好的办法,也欢迎大家提出来讨论

Q11:有时候例如自定义view依赖于服务器返回的model,里面也有很多根据model属性去绘制的过程,这种情况怎么处理?在P层抛出一个model的get方法吗?

自定义的View跟Activity一样,我们统称为View层。上面的例子中View层只有一个接口MainView,实际项目中,View层可能会实现好几个接口。对一个经常会被利用的自定义View,会额外给它新建一个接口。

Q12:你的例子中p层实现中getDate()方法对数据进行了处理,是否m层只是单纯的获取原始数据,对于数据上的业务也放入到p层中处理,有没有好的方式能够复用有关数据业务的这块逻辑

嗯,这个问题我们确实也遇到了。在项目实际操作过程中,如果有比较复杂业务流程,我会单独再分离出一层业务层,业务层再去调用dataSource取数据。如果只是单纯的取数据展示,现在这样就够了,尽量避免过度设计。

Q13:为了更好的解偶每一层,你们用MVP时 是否每层都有自己的数据结构,如果有的话,层与层之间的数据结构转换开销大不大?

目前来讲,大部分的业务都是一个数据结构穿透使用的,偶尔会有数据结构重新封装, 影响不大。我个人判断的话,相比IO处理,数据结构的转换开销还是小的,而且,如果有很多复杂转换的话,保证不要在UI线程中做,也不会太大问题。

Q14:activity与p层用接口的方式衔接的价值在哪?另外如何界定展现方法在哪调用?比如页面需要显示一个标题,内容是从之前页面传过来的,那是在activity接收后就直接显示?还是先传递到p层再回调activity的显示方法?感谢

价值在于,把presenter 与activity解耦之后,我可以在别的activity使用这个presenter层逻辑,也可以在这个activity 里调用其它页面的presenter方法。如果是前页传过来的,直接显示就好,不做过度设计。

Q15:rxJava使用lamaba的语法格式的话貌似会将代码缩减很多,请问嘉宾有试过这种方式吗?这个对项目的性能会有什么影响吗?因为我试用过几次后一直出现oom的问题

lambda表达式会让语法看起来更简洁,非常推荐使用。但我们的项目目前只能使用jdk 7,悲伤。如果后面我们有机会切换的话,可以再一起分享一下。

Q16:rxjava怎么实现队列像handler message那样,就是队列执行,不是并发执行?

rxJava中的just方法和from方法都是以队列形式发出事件。我猜你想问的问题可能是:一个接口的请求依赖另一个API请求返回的数据,这就是嵌套回调问题。可以找下大头鬼Bruce的一篇文章,《RxJava使用场景小结》,里面有介绍的,这里不详细讨论了。

更多精彩内容欢迎关注bugly的微信公众账号:

腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!

一个超酷的开源uHand2.0机械手掌项目 uHand2.0是深圳乐幻索尔公司开源的一款机械手掌,它长下面这个样子:1、uHand2.0外观图之前在公众号就分享过视频:学习嵌入式可以带娃,不信你们看2、uHand2.0硬件原理图看... 阅读详情

相关推荐

SAP物料分类账实战:从配置到月结的关键步骤(基于S/4HANA1909)

本文详细解析了在SAP S/4HANA 1909系统中,物料分类账从基础配置到月结操作的全流程。作为成本核算的核心,物料分类账通过多级价格确定实现实际成本核算,关键步骤包括激活物料分类账、配置自动过账科目(OBYC)、运行CKMLCP进行差异分摊与结算。文章旨在帮助财务与成本会计人员确保成本差异的准确归集与分摊,顺利完成月结。

weixin_28314575的博客 195

Rxjava3文档级教程一: 介绍和基本使用

一 Rxjava3简介 RxJava是响应式编程(Reactive Extensions)的java实现,它基于观察者模式的实现了异步编程接口。 Rxjava 3.x 的github官网 RxJava2将被支持到2021年2月28日,错误的会同时在2.x和3.x修复,但新功能只会在3.x上添加。 Rxjava 3.0的一些改变:官方Wiki Rxjava 3.x 文档可以在官方javad...

许进进的博客 4万+

scRNA-seq的fastq文件处理流程——持续更新

获得了一批新的scRNA-seq的fastq.gz文件,每个样本的数据形式为: 我打算使用10X cellranger处理fastq.gz文件,下载及安装方式在官网:https://support.10xgenomics.com/single-cell-gene-expression/software/downloads/2.0这个网址写了10X cellranger处理fastq.gz文件的命名规则https://support.10xgenomics.com/single-cell-gene-expr

watermel__的博客 3198

RxJava2从入门到精通-初级篇

适合所有初中级工程师,从RxJava的每个知识点进行讲解,并在每个知识点中都带有文字说明和代码例子说明。通过这次系统化的学习,您将可以完整的学习到RxJava家族的所有特性和常用的操作符,掌握操作符的使用,掌握RxJava与Rx其他第三方库的使用。可以用三句简单的话进行概括面试加分利器 = 加大录取机会加快工作效率 = 早点下班回家系统化的学习 = 能力全面提升

【Zemax光学设计实训一】---单透镜光学设计

建立一个焦距为100mm、入瞳直径为25mm的单透镜系统,该透镜中心厚度为4mm,其两个面的曲率半径分别为100mm、-100mm,全视场2w=10°。该系统在可见光下工作,采用BK7玻璃,光阑设置在人射光线遇到的透镜的第一个光学表面;并对其展开优化。

yh的博客 3618

如何用python开发“跳一跳”游戏【附源码】

jump_start_time = pygame.time.get_ticks() # 记录跳跃开始时间。jump_duration = current_time - jump_start_time # 计算跳跃持续时间。current_time = pygame.time.get_ticks() # 获取当前时间。jump_velocity = -15 # 设置跳跃的初始速度。# 如果小球跳跃结束,重置跳跃状态。# 根据跳跃持续时间计算跳跃高度。# 移除超出屏幕的障碍物。

helloshili2011的博客 2496

RxJava详解

1. Schedulers.io(): I/O 操作(读写文件、数据库、网络请求等),与newThread()差不多,区别在于io() 的内部实现是是用一个无数量上限的线程池,可以重用空闲的线程,因此多数情况下 io() 效率比 newThread() 更高。传统的嵌套请求,一般都是在前一个请求的 onSuccess() 回调里面发起新的请求,这样一旦嵌套多个的话,缩进就是大问题了,而且严重的影响代码的可读性。为什么需要返回值呢?不难发现,上述的 map 操作符,是一对一的变换,并且返回的是变换后的对象。

weixin_40387773的博客 4703

《AI编程实战:深度学习模型改进与系统部署》,改进专栏目录和介绍

专深度学习相关项目都写在本专栏,《一次订阅解锁全部,都有源码,永久观看》,包括车牌识别、股票预测、人脸识别、风格迁移、图像修复、图像超分辨重建、图像分割等任务,Web/PyQt系统实现。引入Transformer、Swin Transformer、DenseNet、ViT、ConvNeXt等算法实战,提供卷积改进,魔改对比实验,模型剪枝,模型蒸馏,模型量化,全网独家整合改进专栏,为不同领域的同学发表论文提供了大力支持。

在职AI算法工程师,擅长计算机视觉,YOLO目标检测、分割等,擅长web、pyqt界面可视化,好内容持续更新中,来这里跟大家一起学习,共同进步 3270

【RxJava】RxJava 简介 ( RxJava 概念 | RxJava 组成 - 被观察者 / 观察者 / 订阅 / 操作符 | RxJava 适用场景 )

一、RxJava 简介 1、RxJava 概念 2、RxJava 组成 - 被观察者 / 观察者 / 订阅 / 操作符 3、RxJava 适用场景

让 学习 成为一种 习惯 ( 韩曙亮 の 技术博客 ) 2601

【七.三维视觉与视频分析】【1.点云处理:PointNet++/PointTransformer】

各位老铁,今天咱们要聊的可不是普通的二维图像处理,而是三维视觉领域最硬核的技术——点云处理。从最早的PointNet到如今的PointTransformer,这场技术进化堪比三维版的"像素革命"。今天咱们就深入解剖两大里程碑:PointNet++和PointTransformer,保证让你看完全文就能在点云领域横着走!想象一下,你抓了把沙子撒在空中,每粒沙子的位置都是三维坐标——这就是点云的典型形态。最后送大家一句话:点云处理就像在三维宇宙中寻找星辰的轨迹,既要望远镜的宏观视野,也要显微镜的细致入微。

商务合作|问题讨论|交流学习 请联系作者微信,加微信请务必注明来意,博客主页有联系方式 474

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

S7-1200 G2移植旧版本S7-1200程序的具体方法示例

Robot_PLC_HMI_Automation 1515

android——rxjava的使用(连续多个弹窗的处理)

本文介绍项目开发中使用到rxjava的情形,以及详细的代码。RxJava是一个基于Java语言的Reactive Extensions库,它用于实现异步编程和流式处理,通过将事件和数据流以数据序列的形式进行处理,提高了代码的可读性和可维护性。

wy313622821的博客 3542

深入大模型-13-大模型Skills应用之标准目录结构和开发一个Skill的步骤

首先对比Prompt工程,上下文工程,Skills工程,MCP工具的概念与区别,然后介绍Skill的标准目录结构,同时描述了开发一个Skill的步骤和最佳实践。

qq_20466211的博客 748

C#实现PDF数字签名移除的技术方案与实践

数字签名技术是保障PDF文档安全性和完整性的核心机制,通过非对称加密算法实现身份认证和防篡改验证。在文档管理和自动化处理场景中,程序化移除PDF签名成为企业级应用的关键需求,特别是在合同更新、模板复用等业务场景下。本文基于iTextSharp库实现C#环境下的签名移除方案,详细解析PDF签名存储结构、表单域清理等核心技术原理,并提供大文件处理、批量操作等工程实践优化建议。该方案适用于文档管理系统、电子合同平台等需要合规修改已签署PDF的场景,同时强调审计日志、权限控制等安全合规要点。

weixin_34146805的博客 449

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

html中a标签中的hover,在a标签内添加hover样式的方法:

【腾讯Bugly干货分享】基于RxJava的一种MVP实现

weixin_40008033的博客 3142

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

【腾讯Bugly干货分享】一步一步实现Android的MVP框架

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5799d7844bef22a823b3ad44内容大纲: Android 开发框架的选择 如何一步步搭建分层框架 使用 RxJava 来解决主线程发出网络请求的问题 结语 一、Android开发框架的选择由于原生 Android 开发应该已经是一个基础的 MVC 框架,所以在初始开

腾讯Bugly的专栏 4185

【腾讯Bugly干货分享】一步一步实现 Android 的 MVP 框架

本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/5799d... 内容大纲: Android 开发框架的选择 如何一步步搭建分层框架 使用 RxJava 来解决主线程发出网络请求的问题 结语 一、Android开发框架的选择 由于原生 Android 开发应该已经是...

weixin_33854644的博客 267

Android分享:如何高效率开发App

前言   关于如何高效率开发App,开发前需要做哪些准备呢?之前在知乎和segmentfault回到过类似的问题,在这里按划分功能模块---设计APP框架---APP质量把关---内测,正式发布的流程来总结。 1)功能模块 网络模块 okhttp android-async-http volley retrofit 事件总线 ott

liumeng920的博客 497

Android组件化实践项目分享

目录介绍 01.项目介绍 02.项目运行 03.项目部分介绍 04.项目组件化结构 05.项目版本更新 06.项目第三方库 07.项目遇到bug 08.项目截图展示 09.项目优化处理 10.组件化博客 11.其他介绍 01.项目介绍 1.1 项目简介 项目整体架构模式采用:组件化+MVP+Rx+Retrofit+design+Dagger2+阿里VLayout+腾讯X5+腾讯bugly 包...

weixin_34313182的博客 503

《给 Android 开发者的 RxJava 详解》笔记

这篇文章是看扔物线的《给 Android 开发者的 RxJava 详解》的笔记,在此仅仅做一个笔记,以便日后查用。RxJava的优势 异步(RxJava本质上是一个实现异步操作的库) 简洁(随着程序逻辑变得越来越复杂,它依然能够保持简洁) API 介绍和原理简析RxJava的观察者模式 RxJava 有四个基本概念:Observable (可观察者,即被观察者)、 Observer (观察者)、

linxi7的博客 731

RXJAVA从入门到精通

一文帮你读懂rxjava

qq_50709355的博客 4680

重拾Android之路(五)RxJava和RxAndroid

现在RxJava和RxAndroid越来越火爆,自己在业余时间也学习了一下,感觉确实很好用,之前 为了完成页面刷新,数据请求,组件信息传递的时候,要使用handler,真的是逻辑思路很强,稍微不注意,就各种错误一大堆。这下有了RxJava和RxAndroid,真的爽。 RxJava 网上有很多给RxJava做定义的,很多人说的比较官方,而我是比较笨的那种人,所以看了很久也没有看懂,不过...

牛谱乐的博客 3539

RxJava基本概念

RxJava是ReactiveX的一种Java实现。 ReactiveX是Reactive Extensions的缩写,一般简写为Rx。微软给出的定义是,Rx是一个函数库,让开发者可以利用可观察序列和LINQ(Language Integrated Query)风格查询操作符来编写异步和基于事件的程序。开发者可以用Observables表示异步数据流,用LINQ操作符查询异步数据流,用Schedulers参数化异步数据流并发处理,Rx可以这样定义:Rx=Observables+LINQ+Scheduler

m0_63970488的博客 1043

【RxJava】RxJava3核心功能讲解和源码分析

一个是Observable的订阅顺序,一个是doOnSubscribe的执行顺序,Observable的订阅顺序上面已经得出结论了,是从后往前执行的。当没有指定ObserveOn,但是指定了SubscribeOn时,由于onNext代码是从最上游的Observable.subscribeActual开始的,所以所有的onNext都会在最近一个SubscribeOn指定的线程中执行。reduce:将上游Observable的相邻两个数据进行运算,再拿结果与下一个数据进行运算,如此循环,得到一个最终值。

天天向上 Up Up Up (*^▽^*) 2379
上一篇: 【腾讯Bugly干货分享】Android动态布局入门及NinePatchChunk解密
下一篇: 【腾讯Bugly干货分享】微信iOS SQLite源码优化实践分享实录
腾讯Bugly
博客等级 码龄12年 1875粉丝 201原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值