rxjava能代替handler吗

rxjava能代替handler吗,第1张

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(Schedulers.io()).observeOn(AndroidSchedulers.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(Schedulers.io()).observeOn(AndroidSchedulers.mainThread()).subscribe((Action1)(bitmap)->{imageCollectorView.addImage(bitmap)})如果你习惯使用Retrolambda,你也可以直接把代码写成上面这种简洁的形式。而如果你看到这里还不知道什么是Retrolambda,我不建议你现在就去学习它。原因有两点:1.Lambda是把双刃剑,它让你的代码简洁的同时,降低了代码的可读性,因此同时学习RxJava和Retrolambda可能会让你忽略RxJava的一些技术细节;2.Retrolambda是Java6/7对Lambda表达式的非官方兼容方案,它的向后兼容性和稳定性是无法保障的,因此对于企业项目,使用Retrolambda是有风险的。所以,与很多RxJava的推广者不同,我并不推荐在学习RxJava的同时一起学习Retrolambda。事实上,我个人虽然很欣赏Retrolambda,但我从来不用它。

1、Rxjava逻辑会比较清晰,蛋代码可读性比较差;用在后台的业务处理上,后台业务通常复杂,步骤多,这会让逻辑更清晰,但是前端基本上没有必要用,而且代码可读性比较差;

2、ReTrofit每次发起请求都会创建OkHttp,桥做判不会复用,导致单条数敏改据的请求性能低了一倍以上;

3、Rxjava+ReTrofit组合起来运行的性能非常低,特别是并发的时候,性能更低,测试发现并发100条要胡橘1200ms,不使用的话并发130ms;

4、Rxjava+ReTrofit组合当需要读取本地缓存的时候,读缓存是通过URL作为KEY来读取,这样就需要写两遍的URL,一遍是框架用的,一遍是用于缓存的,使用起来更不方便;

以上是本人使用过程中的经历,有没有高手解惑,目前决定放弃这套组合,自己实现一套


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12141498.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-21
下一篇 2023-05-21

发表评论

登录后才能评论

评论列表(0条)

保存