为什么不用rxjava?

Posted 世界很大,风住过这里

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了为什么不用rxjava?相关的知识,希望对你有一定的参考价值。

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<File, Observable<File>>() {
        @Override
        public Observable<File> call(File file) {
            return Observable.from(file.listFiles());
        }
    })
    .filter(new Func1<File, Boolean>() {
        @Override
        public Boolean call(File file) {
            return file.getName().endsWith(".png");
        }
    })
    .map(new Func1<File, Bitmap>() {
        @Override
        public Bitmap call(File file) {
            return getBitmapFromFile(file);
        }
    })
    .subscribeOn(Schedulers.io())
    .observeOn(androidSchedulers.mainThread())
    .subscribe(new Action1<Bitmap>() {
        @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.好的思想不懂合理利用,看看Android-LessCallBack是怎么用的 

   //按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怎么怎么好,支持什么什么  可以扩展什么什么  巴拉巴拉... 真正有自己的理解的有几个? 

一群小菜比  

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

 

以上是关于为什么不用rxjava?的主要内容,如果未能解决你的问题,请参考以下文章

深入浅出RxJava

RxJava

使用 RxJava 将数据从 ViewModel 移动到 Fragment

使用 rxJava 和改造多次调用另一个请求中的请求

导航到另一个片段时触发 API 调用

如何在基础活动暂停时暂停rxjava Observable.interval