导航:首页 > 编程语言 > rxjavafrom和just

rxjavafrom和just

发布时间:2023-11-16 02:11:31

❶ rxjava能代替handler吗

RxJava好在哪换句话说,『同样是做异步,为什么人们用它,而不用现成的AsyncTask/Handler/XXX/?』一个词:简洁。异步操作很关键的一点是程序的简洁性,因为在调度过程比较复杂的情况下,异步代码经常会既难写也难被读懂。Android创造的AsyncTask和Handler,其实都是为了让异步代码更加简洁。RxJava的优势也是简洁,但它的简洁的与众不同之处在于,随着程序逻辑变得越来越复杂,它依然能够保持简洁。假设有这样一个需求:界面上有一个自定义的视图imageCollectorView,它的作用是显示多张图片,并能使用addImage(Bitmap)方法来任意增加显示的图片。现在需要程序将一个给出的目录数组File[]folders中每个目录下的png图片都加载出来并显示在imageCollectorView中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在UI线程执行。常用的实现方式有多种,我这里贴出其中一种:newThread(){@Overridepublicvoidrun(){super.run();for(Filefolder:folders){File[]files=folder.listFiles();for(Filefile:files){if(file.getName().endsWith(".png")){finalBitmapbitmap=getBitmapFromFile(file);getActivity().runOnUiThread(newRunnable(){@Overridepublicvoidrun(){imageCollectorView.addImage(bitmap);}});}}}}}.start();而如果使用RxJava,实现方式是这样的:Observable.from(folders).flatMap(newFunc1>(){@OverridepublicObservablecall(Filefile){returnObservable.from(file.listFiles());}}).filter(newFunc1(){@OverridepublicBooleancall(Filefile){returnfile.getName().endsWith(".png");}}).map(newFunc1(){@OverridepublicBitmapcall(Filefile){returngetBitmapFromFile(file);}}).subscribeOn(Schelers.io()).observeOn(AndroidSchelers.mainThread()).subscribe(newAction1(){@Overridepublicvoidcall(Bitmapbitmap){imageCollectorView.addImage(bitmap);}});那位说话了:『你这代码明明变多了啊!简洁个毛啊!』大兄弟你消消气,我说的是逻辑的简洁,不是单纯的代码量少(逻辑简洁才是提升读写代码速度的必杀技对不?)。观察一下你会发现,RxJava的这个实现,是一条从上到下的链式调用,没有任何嵌套,这在逻辑的简洁性上是具有优势的。当需求变得复杂时,这种优势将更加明显(试想如果还要求只选取前10张图片,常规方式要怎么?如果有这样那样的要求呢?再试想,在这一大堆需求实现完两个月之后需要改功能,当你翻回这里看到自己当初写下的那一片迷之缩进,你能保证自己将迅速看懂,而不是对着代码重新捋一遍思路?)。另外,如果你的IDE是AndroidStudio,其实每次打开某个Java文件的时候,你会看到被自动Lambda化的预览,这将让你更加清晰地看到程序逻辑:Observable.from(folders).flatMap((Func1)(folder)->{Observable.from(file.listFiles())}).filter((Func1)(file)->{file.getName().endsWith(".png")}).map((Func1)(file)->{getBitmapFromFile(file)}).subscribeOn(Schelers.io()).observeOn(AndroidSchelers.mainThread()).subscribe((Action1)(bitmap)->{imageCollectorView.addImage(bitmap)});如果你习惯使用Retrolambda,你也可以直接把代码写成上面这种简洁的形式。而如果你看到这里还不知道什么是Retrolambda,我不建议你现在就去学习它。原因有两点:1.Lambda是把双刃剑,它让你的代码简洁的同时,降低了代码的可读性,因此同时学习RxJava和Retrolambda可能会让你忽略RxJava的一些技术细节;2.Retrolambda是Java6/7对Lambda表达式的非官方兼容方案,它的向后兼容性和稳定性是无法保障的,因此对于企业项目,使用Retrolambda是有风险的。所以,与很多RxJava的推广者不同,我并不推荐在学习RxJava的同时一起学习Retrolambda。事实上,我个人虽然很欣赏Retrolambda,但我从来不用它。

❷ rxjava zip和merge的区别

跟自merge的区别是:
1.方法的参数不一样,zip有一个合并函数,merge没有,所以zip发射数据是合并函数的返回值,merge则是交错排列多个源Observable发射的数据。
2.merge的终止不会受任何一个Observable的发射完成而终止,zip则只要有一个Observable的发射完成而终止发射
(merge和zip中只要有一个错误通知终止,就都终止)

❸ rxjava from和just的区别

EventBus比较适合仅仅当做组件间的通讯工具使用,主要用来传递消息。使用EventBus可以避内免搞出一大推的容interface,仅仅是为了实现组件间的通讯,而不得不去实现那一推的接口。

RxJava和EventBus一样也是基于观察者模式,但是使用的场景确实异步数据流的处理。比如下面的例子

Observable.from()
.map((x) -> x + 1)
.filter((x) -> x % 2 == 0)
.subscribe()

通过引入函数式的方式来处理数据流,看起来舒服多了。另外RxJava有大量丰富强大的operator,可以满足你的大部分数据处理需求。RxJava另一个强大的地方就是他的scheler,你可以为Observable和Subscriber指定不同的执行线程,在Android中,你就可以方便的将Observable指定在IO线程中运行,Subscriber在UI线程中运行。

阅读全文

与rxjavafrom和just相关的资料

热点内容
怎么把文件存在苹果手机文件app中 浏览:517
恶意代码防范规范 浏览:767
用于建立或修改程序文件的命令是 浏览:25
phantomjs指定端口 浏览:448
extjs获取当前第几行 浏览:518
怎样导出sql数据库文件格式 浏览:157
u盘系统文件格式 浏览:376
javafind数组 浏览:41
t2080升级cpu 浏览:190
微信文件倒出来哪里找到 浏览:722
单元格删除文件夹内容 浏览:170
word2003如何修改作者 浏览:217
默认数据库端口 浏览:537
sql数据库mdb在哪里 浏览:819
win10创作者更新了什么好处 浏览:994
linuxtunelp 浏览:665
centos打开zip文件格式 浏览:995
java文明5 浏览:86
ipad输密码没反应 浏览:916
一号文件中提出了哪些要求 浏览:527

友情链接