博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
为什么不用rxjava?
阅读量:7060 次
发布时间:2019-06-28

本文共 4418 字,大约阅读时间需要 14 分钟。

rxjava等系列产品.思想是很好的,但是被大多数人用成了一坨屎!

就拿rx最经典的那个例子来说:

假设有这样一个需求:界面上有一个自定义的视图 imageCollectorView ,它的作用是显示多张图片,并能使用 addImage(Bitmap) 方法来任意增加显示的图片。现在需要程序将一个给出的目录数组 File[] folders 中每个目录下的 png 图片都加载出来并显示在imageCollectorView 中。需要注意的是,由于读取图片的这一过程较为耗时,需要放在后台执行,而图片的显示则必须在 UI 线程执行。常用的实现方式有多种,我这里贴出其中一种:

new Thread() {    @Override    public void run() {        super.run();        for (File folder : folders) {            File[] files = folder.listFiles();            for (File file : files) {                if (file.getName().endsWith(".png")) {                    final Bitmap bitmap = getBitmapFromFile(file);                    getActivity().runOnUiThread(new Runnable() {                        @Override                        public void run() {                            imageCollectorView.addImage(bitmap);                        }                    });                }            }        }    }}.start();

猛一看有点繁琐,应该可以优化下,别急先看看rx怎么实现.

 

rxjava :

Observable.from(folders)    .flatMap(new Func1
>() { @Override public Observable
call(File file) { return Observable.from(file.listFiles()); } }) .filter(new Func1
() { @Override public Boolean call(File file) { return file.getName().endsWith(".png"); } }) .map(new Func1
() { @Override public Bitmap call(File file) { return getBitmapFromFile(file); } }) .subscribeOn(Schedulers.io()) .observeOn(AndroidSchedulers.mainThread()) .subscribe(new Action1
() { @Override public void call(Bitmap bitmap) { imageCollectorView.addImage(bitmap); } });

猛一看mdzz(玛德制杖),仔细一看mdzzz(玛德真制杖)----> 代码写成这样不脑残么?知不知道什么叫做解耦合啊? 

我的实现:

//----------开始加载所有图片     public void addAllImg(){         x.task().run(new Runnable() {
//我用xutils3异步任务 @Override public void run() { for (File folder : folders) { //遍历文件夹 File[] files = folder.listFiles(); for (File file : files) { //遍历文件 addAllImg_1(file); //调用后续方法处理 } } } }); } private void addAllImg_1(File file){ //处理,更新ui等 if (file.getName().endsWith(".png")) { final Bitmap bitmap = getBitmapFromFile(file); getActivity().runOnUiThread(new Runnable() { @Override public void run() { imageCollectorView.addImage(bitmap); } }); } }
//----------加载所有图片完毕

rx系列缺点太多了,任意一条都够理由不用他了       因为有更好的实现呀     

1.过度使用设计模式,逻辑是只有一条但是代码被你们写成了屎呀  还链式也是醉人

  什么叫链式,看我的实现...     支持继续扩展 2 3 4 5 6 ... n

private void addAllImg_2()
private void addAllImg_3()

   ...

2.好的思想不懂合理利用,看看是怎么用的 

   //按id顺序执行的 

public class Test2 {    @TaskFlow(thread = true, id = 0)    public void doTask1() {        System.out.println(Thread.currentThread().getName()+":"+"任务1");        waitTime();    }    @TaskFlow(thread = false, id = 1)    public void doTask1Finish() {        System.out.println(Thread.currentThread().getName()+":"+"任务1执行结束");    }    @TaskFlow(thread = true, id = 2)    public void doTask2() {        System.out.println(Thread.currentThread().getName()+":"+"任务2");        waitTime();    }    @TaskFlow(thread = false, id = 3)    public void doTask2Finish() {        System.out.println(Thread.currentThread().getName()+":"+"任务2执行结束");    }    public static void main(String[] args) {        TaskFlowUtils.inject(new Test2()).run();;    }    public static void waitTime(){        int x = new Random().nextInt(1000) + 500;        try {            System.out.println("等待"+x+"毫秒");            Thread.sleep(x);        } catch (InterruptedException e) {            // TODO Auto-generated catch block            e.printStackTrace();        }    }}
线程:任务1等待515毫秒ui线程:任务1执行结束线程:任务2等待655毫秒ui线程:任务2执行结束

   在我看来其与rx类似,都用到next这一思想,不同的是:

   lesscallback 实现复杂,调用简单

   rx实现复杂,调用也特么复杂 

3.耦合度太大导致调试困难的问题...满眼的next  subscribe observe 

   有写问题写时候,你可能没发现   维护时候你就懂了 

4.学习难度大,想要吃个牛肉串你让我先学宰牛?  

5.少用interface 如果可以,尽量不要用  (interface是一种挖洞行为,除非不可避免否则不要挖洞)     

对于你们那些  网络请求还先写个interface的我表示无法理解  每个页面都有自己的功能,在各自的页面(函数里)实现自己的功能 更是一种分布式的思想 

随便搜一下都是rx怎么怎么好,支持什么什么  可以扩展什么什么  巴拉巴拉... 真正有自己的理解的有几个? 

一群小菜比  

大道至简,如果理解深刻,用起来会非常简单,搞出来那么复杂的东西  只说明你们理解不太深刻.  

 

转载于:https://www.cnblogs.com/andlp/p/6233201.html

你可能感兴趣的文章
[转载] 2011 ScrumGathering大会简要记录 - 周金根
查看>>
OpenSNS系统评测:社群经济的第一核心是身份标签
查看>>
Linux C语言程序连接mysql数据库
查看>>
Fortigate防火墙配置***使用Radius认证配置说明
查看>>
iOS开发那些事-响应内存警告
查看>>
六、CPU优化(3)处理器组
查看>>
海尔布局厨电产业 国际化与场景化成新方向
查看>>
SFB 项目经验-04-共存迁移-Lync 2013-SFB 2015-Godaddy-更新公网证书
查看>>
Linq to SharePoint与权限提升
查看>>
Ext JS 4.1.1 RC2发布
查看>>
关于session.auto_start报警的问题
查看>>
Python中的注释
查看>>
贴吧的十一年:改变了什么?
查看>>
AD域中组织单位和组的区别
查看>>
关于时间的shell问题,需要调用shell为具有年月日的,比如20110919
查看>>
patchca整合Spring MVC生成超炫的验证码
查看>>
Cocos2d-x 3.x物理引擎概述(2)
查看>>
RAC 升级实录
查看>>
微信QQ淘客裂变群的玩法详解
查看>>
1句运营心法,8个核心词汇读懂运营
查看>>